1:- module(bc_data_config, [
    2    bc_config_get/2,          % +Name, -Value
    3    bc_config_set/2,          % +Name, +Value
    4    bc_config_set_api/3,      % +Actor, +Name, +Value
    5    bc_config_set_list_api/2, % +Actor, +List
    6    bc_config_list/2,         % +Actor, -List
    7    bc_config_dict/1          % -Dict
    8]).    9
   10:- use_module(library(debug)).   11:- use_module(library(docstore)).
 bc_config_get(+Name, -Value) is det
Retrieves the configuration entry. When the entry does not exist then an error error(no_config(Name)) is thrown.
   19bc_config_get(Name, Value):-
   20    (   ds_find(config, name=Name, [Doc])
   21    ->  Value = Doc.value
   22    ;   throw(error(no_config(Name)))).
 bc_config_set_api(+Actor, +Name, +Value) is det
Same as bc_config_set/2 but checks that the current API user is an admin.
   29bc_config_set_api(Actor, Name, Value):-
   30    config_access(Actor),
   31    bc_config_set(Name, Value).
 bc_config_set_list_api(+Actor, List) is det
Same as bc_config_set_api/2 but takes a list of configuration entries.
   38bc_config_set_list_api(Actor, List):-
   39    config_access(Actor),
   40    maplist(config_set_dict, List).
   41
   42config_set_dict(Dict):-
   43    bc_config_set(Dict.name, Dict.value).
   44
   45config_access(Actor):-
   46    Actor.type = admin, !.
   47
   48config_access(_):-
   49    throw(error(no_access)).
 bc_config_set(+Name, +Value) is det
Sets the configuration value. If the value does not exist yet, it is added.
   56bc_config_set(Name, Value):-
   57    debug(bc_data, 'setting ~w to ~p', [Name, Value]),
   58    (   ds_find(config, name=Name, [Doc])
   59    ->  put_dict(value, Doc, Value, New),
   60        ds_update(New)
   61    ;   ds_insert(config{ name: Name, value: Value })).
 bc_config_list(+Actor, -List) is det
Retrieves the list of all config values. Returned list contains dicts config{ name: Name, value: Value }.
   69bc_config_list(Actor, List):-
   70    config_access(Actor),
   71    ds_all(config, List).
 bc_config_dict(-Dict) is det
Retrieves dict containing all config entries.
   78bc_config_dict(Dict):-
   79    ds_all(config, List),
   80    build_dict(List, _{}, Dict).
   81
   82build_dict([Entry|List], Acc, Dict):-
   83    Tmp = Acc.put(Entry.name, Entry.value),
   84    build_dict(List, Tmp, Dict).
   85
   86build_dict([], Dict, Dict)