diff --git a/src/types.ml b/src/types.ml index ef08f05f..e85ce833 100644 --- a/src/types.ml +++ b/src/types.ml @@ -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 diff --git a/test/test.ml b/test/test.ml index 19816d84..9e109112 100644 --- a/test/test.ml +++ b/test/test.ml @@ -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); ()