This commit is contained in:
parent
7597c02c1c
commit
2cbbb49ced
2 changed files with 117 additions and 11 deletions
|
|
@ -16,6 +16,15 @@ alt_unit_names = "{"0":"€","3":"k€"}"
|
||||||
[dummy-section]
|
[dummy-section]
|
||||||
dummy = "blah"
|
dummy = "blah"
|
||||||
|
|
||||||
|
[currency-EUR]
|
||||||
|
enabled= NO
|
||||||
|
code= EUR
|
||||||
|
name= euro
|
||||||
|
fractional_input_digits= 2
|
||||||
|
fractional_normal_digits= 2
|
||||||
|
fractional_trailing_zero_digits= 2
|
||||||
|
alt_unit_names= "{"0":"€","3":"k€"}"
|
||||||
|
|
||||||
[exchange]
|
[exchange]
|
||||||
currency = EUR
|
currency = EUR
|
||||||
currency_round_unit = EUR:0.01
|
currency_round_unit = EUR:0.01
|
||||||
|
|
|
||||||
|
|
@ -205,14 +205,14 @@ let get t ~section ~field =
|
||||||
| None -> fail_with (Fmt.str "option `[%s].%s` not found" section field)
|
| None -> fail_with (Fmt.str "option `[%s].%s` not found" section field)
|
||||||
| Some v -> v
|
| Some v -> v
|
||||||
|
|
||||||
let int v =
|
let int s =
|
||||||
match int_of_string_opt v with
|
match int_of_string_opt s with
|
||||||
| None -> fail_with (Fmt.str "expected int value, got `%s`" v)
|
| None -> fail_with (Fmt.str "expected int value, got `%s`" s)
|
||||||
| Some v -> v
|
| Some v -> v
|
||||||
|
|
||||||
let float v =
|
let float s =
|
||||||
match float_of_string_opt v with
|
match float_of_string_opt s with
|
||||||
| None -> fail_with (Fmt.str "expected float value, got `%s`" v)
|
| None -> fail_with (Fmt.str "expected float value, got `%s`" s)
|
||||||
| Some v -> v
|
| Some v -> v
|
||||||
|
|
||||||
let const_value a b =
|
let const_value a b =
|
||||||
|
|
@ -225,19 +225,62 @@ let yes_no = function
|
||||||
| "YES" -> `YES
|
| "YES" -> `YES
|
||||||
| s -> fail_with (Fmt.str "expected `YES`/`NO` value, got `%s`" s)
|
| s -> fail_with (Fmt.str "expected `YES`/`NO` value, got `%s`" s)
|
||||||
|
|
||||||
let amount v = v |> Amount.of_string |> unwrap_res
|
let amount s = s |> Amount.of_string |> unwrap_res
|
||||||
let duration v = Parse_duration.(v |> parse |> to_ptime_span)
|
let duration s = Parse_duration.(s |> parse |> to_ptime_span)
|
||||||
|
|
||||||
let ed25519 v =
|
let ed25519 s =
|
||||||
v
|
s
|
||||||
|> B32.decode
|
|> B32.decode
|
||||||
|> unwrap_res
|
|> unwrap_res
|
||||||
|> Mirage_crypto_ec.Ed25519.pub_of_octets
|
|> Mirage_crypto_ec.Ed25519.pub_of_octets
|
||||||
|> Result.map_error (fun e -> Fmt.str "%a" Mirage_crypto_ec.pp_error e)
|
|> Result.map_error (fun e -> Fmt.str "%a" Mirage_crypto_ec.pp_error e)
|
||||||
|> unwrap_res
|
|> unwrap_res
|
||||||
|
|
||||||
|
module Parse_alt_unit_names = struct
|
||||||
|
let rm_brackets s =
|
||||||
|
let s = String.trim s in
|
||||||
|
match
|
||||||
|
String.starts_with ~prefix:"{" s && String.ends_with ~suffix:"}" s
|
||||||
|
with
|
||||||
|
| false -> fail_with (Fmt.str "expected json, got `%s`" s)
|
||||||
|
| true ->
|
||||||
|
let s = String.sub s 1 (String.length s - 2) in
|
||||||
|
s
|
||||||
|
|
||||||
|
let rm_quotes s =
|
||||||
|
let s = String.trim s in
|
||||||
|
match
|
||||||
|
String.starts_with ~prefix:"\"" s && String.ends_with ~suffix:"\"" s
|
||||||
|
with
|
||||||
|
| false -> fail_with (Fmt.str "expected quoted string, got `%s`" s)
|
||||||
|
| true ->
|
||||||
|
let s = String.sub s 1 (String.length s - 2) in
|
||||||
|
s
|
||||||
|
|
||||||
|
let parse s =
|
||||||
|
let s = rm_brackets s in
|
||||||
|
String.split_on_char ',' s
|
||||||
|
|> List.map (String.split_on_char ':')
|
||||||
|
|> List.map (function
|
||||||
|
| [ k; v ] -> (k, v)
|
||||||
|
| _ -> fail_with "invalid json key-value map")
|
||||||
|
|> List.map (fun (k, v) ->
|
||||||
|
let k = rm_quotes k in
|
||||||
|
let v = rm_quotes v in
|
||||||
|
let k =
|
||||||
|
match int_of_string_opt k with
|
||||||
|
| None ->
|
||||||
|
fail_with
|
||||||
|
(Fmt.str
|
||||||
|
"invalid json key-value map, expected integer key, got `%s`"
|
||||||
|
k)
|
||||||
|
| Some k -> k
|
||||||
|
in
|
||||||
|
(k, v))
|
||||||
|
end
|
||||||
|
|
||||||
module Config = struct
|
module Config = struct
|
||||||
[@@@ocaml.warning "-32"]
|
[@@@ocaml.warning "-32-69"]
|
||||||
|
|
||||||
let config =
|
let config =
|
||||||
let read_file file = In_channel.with_open_bin file In_channel.input_all in
|
let read_file file = In_channel.with_open_bin file In_channel.input_all in
|
||||||
|
|
@ -312,4 +355,58 @@ module Config = struct
|
||||||
let max_aml_program_runtime = get "max_aml_program_runtime" |> duration
|
let max_aml_program_runtime = get "max_aml_program_runtime" |> duration
|
||||||
let default_purse_limit = get "default_purse_limit" |> int
|
let default_purse_limit = get "default_purse_limit" |> int
|
||||||
end
|
end
|
||||||
|
|
||||||
|
module Currency = struct
|
||||||
|
type t = {
|
||||||
|
enabled: [ `YES | `NO ];
|
||||||
|
code: string;
|
||||||
|
name: string;
|
||||||
|
fractional_input_digits: int;
|
||||||
|
fractional_normal_digits: int;
|
||||||
|
fractional_trailing_zero_digits: int;
|
||||||
|
alt_unit_names: (int * string) list;
|
||||||
|
}
|
||||||
|
|
||||||
|
let currency_sections =
|
||||||
|
List.filter_map
|
||||||
|
(fun v ->
|
||||||
|
match String.starts_with ~prefix:"currency-" v.header with
|
||||||
|
| false -> None
|
||||||
|
| true -> Some v)
|
||||||
|
config
|
||||||
|
|
||||||
|
let parse_currency section =
|
||||||
|
let get field = get config ~section:section.header ~field in
|
||||||
|
{
|
||||||
|
enabled= get "enabled" |> yes_no;
|
||||||
|
code= get "code";
|
||||||
|
name= get "name";
|
||||||
|
fractional_input_digits= get "fractional_input_digits" |> int;
|
||||||
|
fractional_normal_digits= get "fractional_normal_digits" |> int;
|
||||||
|
fractional_trailing_zero_digits=
|
||||||
|
get "fractional_trailing_zero_digits" |> int;
|
||||||
|
alt_unit_names= get "alt_unit_names" |> Parse_alt_unit_names.parse;
|
||||||
|
}
|
||||||
|
|
||||||
|
let all_currencies = List.map parse_currency currency_sections
|
||||||
|
|
||||||
|
(* I think the exchange only handle one currency *)
|
||||||
|
let v =
|
||||||
|
match
|
||||||
|
List.find_opt (fun v -> v.code = Exchange.currency) all_currencies
|
||||||
|
with
|
||||||
|
| None ->
|
||||||
|
fail_with
|
||||||
|
(Fmt.str
|
||||||
|
"section `[currency-%s]` not found, currency `%s` is not defined"
|
||||||
|
Exchange.currency Exchange.currency)
|
||||||
|
| Some v -> v
|
||||||
|
|
||||||
|
(*
|
||||||
|
let () =
|
||||||
|
let pp_pair ppf (k, v) = Fmt.pf ppf "k: %d - v: %s" k v in
|
||||||
|
Fmt.epr "alt unit names:@\n%a@." (Fmt.list pp_pair) v.alt_unit_names;
|
||||||
|
()
|
||||||
|
*)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue