-module(dtrans). -type model_field_name() :: any(). -type model_dynamic_field() :: fun((model_field_name()) -> {ok, iolist()} | {error, wrong_dynamic_field_name}). -type model_field_key() :: model_field_name() | model_dynamic_field(). -export_type([model_field_key/0, model_field_name/0, model_dynamic_field/0]). -type model_field(FieldType) :: #{ required => boolean(), internal => boolean(), validator => fun((FieldType) -> ok | {error, Reason :: term()}), default_value => FieldType, constructor => fun((any()) -> FieldType) | {depends_on, [dtrans_model:field_name()], fun((...) -> FieldType)}, model => dtrans_model:t() }. -export_type([model_field/1]). -type model() :: #{model_field_key() => model_field(any())}. -export_type([model/0]). -type data() :: #{model_field_key() => any()}. -export_type([data/0]). %% API exports -export([new/1]). -export([extract/2]). %%==================================================================== %% API functions %%==================================================================== -spec new(model()) -> {ok, dtrans_model:t()} | {error, Reason} when Reason :: dependency_tree_model_cannot_be_resolved | {cyclic_dependency, Path :: [model_field_name()]}. new(Model) -> dtrans_model:new(Model). -spec extract(data(), dtrans_model:t()) -> {ok, data()} | {error, dtrans_model_field:dtrans_model_field_extracting_error()}. extract(Data, Model) -> dtrans_model:extract(Data, Model). %%==================================================================== %% Internal functions %%====================================================================