123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106openPpxlibopenPpxlib.Ast_builder.Defaultletderiver="hardcaml"letraise_errorf=Location.raise_errorftypet=(label_declaration,expression)Attribute.tletfindtlabel_declaration=Attribute.gettlabel_declarationletcreatename=Attribute.declarenameLabel_declarationAst_pattern.(pstr(pstr_eval__nil^::nil))(funx->x);;letexists=create"exists"letbits=create"bits"letlength=create"length"letrtlmangle=create"rtlmangle"letrtlname=create"rtlname"letrtlprefix=create"rtlprefix"letrtlsuffix=create"rtlsuffix"letwave_format=create"wave_format"(* This represents the [ocaml.doc] attribute, which maps to documentation comments. The
leading [hardcaml.] token is required to bypass some compiler (or ppx) related checks.
I mention it because it's an undocumented hack. *)letdoc=create"hardcaml.ocaml.doc"lethas_exists~loc:_label_declaration=(findexists)label_declaration|>Option.is_some;;lethas_rtlname~loc:_label_declaration=(findrtlname)label_declaration|>Option.is_some;;lethas_rtlprefix~loc:_label_declaration=(findrtlprefix)label_declaration|>Option.is_some;;lethas_rtlsuffix~loc:_label_declaration=(findrtlsuffix)label_declaration|>Option.is_some;;letget_exists~loclabel_declaration=match(findexists)label_declarationwith|Someexists->exists|None->raise_errorf~loc"[%s] exists attribute required in [option]"deriver;;letget_bits_opt~loc:_label_declaration=(findbits)label_declarationletget_bits_with_default~loclabel_declaration=matchget_bits_opt~loclabel_declarationwith|Someexpr->expr|None->pexp_constant~loc(Pconst_integer("1",None));;letget_length~loclabel_declaration=match(findlength)label_declarationwith|Someexpr->expr|None->raise_errorf~loc"[%s] length attribute must be set"deriver;;letget_wave_format~loclabel_declaration=match(findwave_format)label_declarationwith|Someexpr->expr|None->[%exprPpx_hardcaml_runtime.Wave_format.default];;letget_rtlname~loctxtlabel_declaration=match(findrtlname)label_declarationwith|Someexpr->expr|None->pexp_constant~loc(Pconst_string(txt,loc,None));;letget_rtlprefix~loc:_~(opts:Interface_options.t)label_declaration=match(findrtlprefix)label_declarationwith|Someexpr->Someexpr|None->opts.rtlprefix;;letget_rtlsuffix~loc:_~(opts:Interface_options.t)label_declaration=match(findrtlsuffix)label_declarationwith|Someexpr->Someexpr|None->opts.rtlsuffix;;letget_rtlmangle~loc:_~(opts:Interface_options.t)label_declaration=match(findrtlmangle)label_declarationwith|Someexpr->Someexpr|None->opts.rtlmangle;;letget_doc~loclabel_declaration=match(finddoc)label_declarationwith|Someexpr->(matchexpr.pexp_descwith|Pexp_constant(Pconst_string(str,_,_))->Somestr|_->raise_errorf~loc"[%s] doc atttribute must be a string"deriver)|None->None;;