fix amount parser

todo: private type
This commit is contained in:
Swrup 2025-10-03 22:42:16 +02:00
parent a04e179c08
commit cdd6d5142b
2 changed files with 10 additions and 6 deletions

View file

@ -95,20 +95,20 @@ module Amount = struct
let parse_currency = string "EUR" *> return `Eur in
let parse_int =
take_while1 (function '0' .. '9' -> true | _ -> false)
>>| Int64.of_string
>>| Int64.of_string_opt
>>= function
| None -> fail "invalid integer"
| Some n -> return n
in
let parse_t =
lift4
(fun sign currency value fraction ->
{ sign; currency; value; fraction })
make ~sign ~currency ~value ~fraction)
parse_sign parse_currency
(char ':' *> parse_int)
(char '.' *> parse_int)
in
fun s ->
match parse_string ~consume:Consume.All parse_t s with
| Ok v -> Ok v
| Error e -> Error e
fun s -> parse_string ~consume:Consume.All parse_t s |> Result.join
end
module Eddsa = struct

View file

@ -32,4 +32,8 @@ let () =
let s = to_string v in
let v' = of_string s |> Result.get_ok in
assert (v = v');
let r = of_string {|~EUR:4.9|} in
assert (Result.is_error r);
let r = of_string {|+EUR:4.99999999999999999999999|} in
assert (Result.is_error r);
()