have api.ml not depends on config.ml

This commit is contained in:
swrup 2026-03-29 19:38:22 +02:00 committed by Swrup
parent 5532798ea5
commit f3483594ac
3 changed files with 63 additions and 79 deletions

View file

@ -135,12 +135,41 @@ module ErrorDetail = struct
end end
module CurrencySpecification = struct module CurrencySpecification = struct
module Alt_unit_names = struct
open Syntax
module Int_map = Map.Make (Int)
module String_map = Map.Make (String)
type t = string Int_map.t
let jsont =
let of_string_map str_map =
str_map
|> String_map.to_list
|> list_map (fun (k, v) ->
match int_of_string_opt k with
| None -> Error "not an integer"
| Some k -> Ok (k, v))
|> function
| Error e -> Jsont.Error.msg Jsont.Meta.none e
| Ok l -> Int_map.of_list l
in
let to_string_map int_map =
int_map
|> Int_map.to_list
|> List.map (fun (k, v) -> (string_of_int k, v))
|> String_map.of_list
in
let string_map_jsont = Jsont.Object.as_string_map Jsont.string in
Jsont.map ~dec:of_string_map ~enc:to_string_map string_map_jsont
end
type t = { type t = {
name: string; name: string;
num_fractional_input_digits: int; num_fractional_input_digits: int;
num_fractional_normal_digits: int; num_fractional_normal_digits: int;
num_fractional_trailing_zero_digits: int; num_fractional_trailing_zero_digits: int;
alt_unit_names: Config.Currency.Alt_unit_names.t; alt_unit_names: Alt_unit_names.t;
common_amounts: Amount.t list; common_amounts: Amount.t list;
} }
@ -172,8 +201,7 @@ module CurrencySpecification = struct
~enc:num_fractional_normal_digits ~enc:num_fractional_normal_digits
|> mem "num_fractional_trailing_zero_digits" Jsont.int |> mem "num_fractional_trailing_zero_digits" Jsont.int
~enc:num_fractional_trailing_zero_digits ~enc:num_fractional_trailing_zero_digits
|> mem "alt_unit_names" Config.Currency.Alt_unit_names.jsont |> mem "alt_unit_names" Alt_unit_names.jsont ~enc:alt_unit_names
~enc:alt_unit_names
|> mem "common_amounts" (Jsont.list Amount.jsont) ~enc:common_amounts |> mem "common_amounts" (Jsont.list Amount.jsont) ~enc:common_amounts
|> finish |> finish
end end
@ -227,31 +255,6 @@ module ExchangeVersionResponse = struct
|> finish |> finish
end end
let currency_specification =
let open Config.Currency in
CurrencySpecification.
{
name= v.name;
num_fractional_input_digits= v.fractional_input_digits;
num_fractional_normal_digits= v.fractional_normal_digits;
num_fractional_trailing_zero_digits= v.fractional_trailing_zero_digits;
alt_unit_names= Config.Currency.v.alt_unit_names;
common_amounts= [];
}
let config =
ExchangeVersionResponse.
{
version= Libtool_version.mte_protocol_version;
name= "taler-exchange";
currency= Config.currency;
currency_specification;
implementation= None;
shopping_url= None;
open_banking_gateway= None;
aml_spa_dialect= None;
}
module RsaDenominationKey = struct module RsaDenominationKey = struct
type t = { type t = {
age_mask: int; age_mask: int;

View file

@ -86,35 +86,6 @@ module Exchangedb_postgres = struct
end end
module Currency = struct module Currency = struct
module Alt_unit_names = struct
open Syntax
module Int_map = Map.Make (Int)
module String_map = Map.Make (String)
type t = string Int_map.t
let jsont =
let of_string_map str_map =
str_map
|> String_map.to_list
|> list_map (fun (k, v) ->
match int_of_string_opt k with
| None -> Error "not an integer"
| Some k -> Ok (k, v))
|> function
| Error e -> Jsont.Error.msg Jsont.Meta.none e
| Ok l -> Int_map.of_list l
in
let to_string_map int_map =
int_map
|> Int_map.to_list
|> List.map (fun (k, v) -> (string_of_int k, v))
|> String_map.of_list
in
let string_map_jsont = Jsont.Object.as_string_map Jsont.string in
Jsont.map ~dec:of_string_map ~enc:to_string_map string_map_jsont
end
type t = { type t = {
enabled: [ `YES | `NO ]; enabled: [ `YES | `NO ];
code: string; code: string;
@ -122,7 +93,7 @@ module Currency = struct
fractional_input_digits: int; fractional_input_digits: int;
fractional_normal_digits: int; fractional_normal_digits: int;
fractional_trailing_zero_digits: int; fractional_trailing_zero_digits: int;
alt_unit_names: Alt_unit_names.t; alt_unit_names: Api.CurrencySpecification.Alt_unit_names.t;
} }
let currency_sections = let currency_sections =
@ -142,24 +113,31 @@ module Currency = struct
get "fractional_trailing_zero_digits" |> int; get "fractional_trailing_zero_digits" |> int;
alt_unit_names= alt_unit_names=
get "alt_unit_names" get "alt_unit_names"
|> Jsont_bytesrw.decode_string Alt_unit_names.jsont |> Jsont_bytesrw.decode_string
Api.CurrencySpecification.Alt_unit_names.jsont
|> unwrap_or_failure; |> unwrap_or_failure;
} }
let all_currencies = List.map parse_currency currency_sections let specification =
currency_sections
let v = |> List.map parse_currency
match |> List.find_opt (fun v -> v.code = Exchange.currency)
List.find_opt (fun v -> v.code = Exchange.currency) all_currencies |> function
with
| None -> | None ->
failure failure
"section `[currency-%s]` not found, currency `%s` is not defined" "section `[currency-%s]` not found, currency `%s` is not defined"
Exchange.currency Exchange.currency Exchange.currency Exchange.currency
| Some v -> ( | Some v when v.enabled <> `YES ->
match v.enabled = `YES with failure "currency `%s` is not enabled" Exchange.currency
| false -> failure "currency `%s` is not enabled" Exchange.currency | Some v ->
| true -> v) {
Api.CurrencySpecification.name= v.name;
num_fractional_input_digits= v.fractional_input_digits;
num_fractional_normal_digits= v.fractional_normal_digits;
num_fractional_trailing_zero_digits= v.fractional_trailing_zero_digits;
alt_unit_names= v.alt_unit_names;
common_amounts= [];
}
end end
module Coin = struct module Coin = struct

View file

@ -18,16 +18,19 @@ let seed req _server _env =
let config req _server _env = let config req _server _env =
Logs.info (fun m -> m "GET /config"); Logs.info (fun m -> m "GET /config");
let jsont = Api.ExchangeVersionResponse.jsont in Respond.ok req ExchangeVersionResponse.jsont
Respond.ok req jsont config ExchangeVersionResponse.
{
version= Libtool_version.mte_protocol_version;
name= "taler-exchange";
currency= Config.currency;
currency_specification= Config.Currency.specification;
implementation= None;
shopping_url= None;
open_banking_gateway= None;
aml_spa_dialect= None;
}
(* not implemented:
- kyc
- wads
- account limits
- zero limited operations
- recoup
- extensions *)
let mk_keys ~db_conn (module Keys : Keys.S) ~last_issue_date = let mk_keys ~db_conn (module Keys : Keys.S) ~last_issue_date =
let version = Libtool_version.mte_protocol_version in let version = Libtool_version.mte_protocol_version in
let base_url = Config.base_url in let base_url = Config.base_url in
@ -35,7 +38,7 @@ let mk_keys ~db_conn (module Keys : Keys.S) ~last_issue_date =
let shopping_url = Config.shopping_url in let shopping_url = Config.shopping_url in
let open_banking_gateway = Config.open_banking_gateway_url in let open_banking_gateway = Config.open_banking_gateway_url in
let bank_compliance_language = Config.bank_compliance_language in let bank_compliance_language = Config.bank_compliance_language in
let currency_specification = Api.currency_specification in let currency_specification = Config.Currency.specification in
let tiny_amount = Config.tiny_amount in let tiny_amount = Config.tiny_amount in
let stefan_abs = Config.stefan_abs in let stefan_abs = Config.stefan_abs in
let stefan_log = Config.stefan_log in let stefan_log = Config.stefan_log in