(* script to generate signatures.ml module get signatures definition form `exchange/src/include/taler/taler_signatures.h` the make a ocaml value for each #define and print them in a taler_signatures.ml module *) open Angstrom type define = { name: string; value: int; } let define_line : define t = let is_ident_char = function | 'A' .. 'Z' | '0' .. '9' | '_' -> true | _ -> false in let p = string "#define" *> skip_while (( = ) ' ') *> string "TALER_SIGNATURE_" *> take_while1 is_ident_char >>= fun name -> skip_while (( = ) ' ') *> take_while1 (function '0' .. '9' -> true | _ -> false) >>| fun digits -> let name = String.lowercase_ascii name in let value = int_of_string digits in { name; value } in p <* end_of_line let all_defines : define list t = let any_line = take_till (Char.equal '\n') <* end_of_line in many (choice [ define_line >>| Option.some; any_line *> return None ]) >>| List.filter_map Fun.id let parse input = match parse_string ~consume:All all_defines input with | Ok defs -> defs | Error msg -> failwith msg let () = let l = parse Data.content in assert (List.length l = 74); let pp ppf { name; value } = Fmt.pf ppf "let %s = %d@." name value in Fmt.pr "%a" (Fmt.list pp) l; ()