-module(galchemy@orm@materializer). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src\\galchemy\\orm\\materializer.gleam"). -export([with_identity_map/2, row/3, identity_map/1, new/1, registry/1, materialize_with_hooks/3, materialize/2, materialize_many/2, materialize_many_with_hooks/3]). -export_type([row_data/0, materializer/0, materialization_error/0, materialization_hook_error/1]). -type row_data() :: {row_data, galchemy@schema@relation:table_ref(), list(galchemy@session@unit_of_work:field_value())}. -type materializer() :: {materializer, galchemy@orm@mapper_registry:mapper_registry(), galchemy@orm@identity_map:identity_map()}. -type materialization_error() :: {registry_error, galchemy@orm@mapper_registry:registry_error()} | {entity_error, galchemy@orm@entity:entity_error()} | {identity_map_error, galchemy@orm@identity_map:identity_map_error()}. -type materialization_hook_error(KHK) :: {materialization_error, materialization_error()} | {hook_error, KHK}. -file("src\\galchemy\\orm\\materializer.gleam", 36). -spec with_identity_map( galchemy@orm@mapper_registry:mapper_registry(), galchemy@orm@identity_map:identity_map() ) -> materializer(). with_identity_map(Registry, Identities) -> {materializer, Registry, Identities}. -file("src\\galchemy\\orm\\materializer.gleam", 43). -spec row(binary(), binary(), list(galchemy@session@unit_of_work:field_value())) -> row_data(). row(Schema_name, Table_name, Fields) -> {row_data, galchemy@schema@relation:table_ref(Schema_name, Table_name), Fields}. -file("src\\galchemy\\orm\\materializer.gleam", 137). -spec identity_map(materializer()) -> galchemy@orm@identity_map:identity_map(). identity_map(Materializer) -> erlang:element(3, Materializer). -file("src\\galchemy\\orm\\materializer.gleam", 32). -spec new(galchemy@orm@mapper_registry:mapper_registry()) -> materializer(). new(Registry) -> {materializer, Registry, galchemy@orm@identity_map:empty()}. -file("src\\galchemy\\orm\\materializer.gleam", 141). -spec registry(materializer()) -> galchemy@orm@mapper_registry:mapper_registry(). registry(Materializer) -> erlang:element(2, Materializer). -file("src\\galchemy\\orm\\materializer.gleam", 187). -spec map_hook_error({ok, galchemy@orm@entity:entity()} | {error, KIR}) -> {ok, galchemy@orm@entity:entity()} | {error, materialization_hook_error(KIR)}. map_hook_error(Value) -> case Value of {ok, Inner} -> {ok, Inner}; {error, Error} -> {error, {hook_error, Error}} end. -file("src\\galchemy\\orm\\materializer.gleam", 196). -spec result_try( {ok, KIX} | {error, KIY}, fun((KIX) -> {ok, KJB} | {error, KIY}) ) -> {ok, KJB} | {error, KIY}. result_try(Value, Next) -> case Value of {ok, Inner} -> Next(Inner); {error, Error} -> {error, Error} end. -file("src\\galchemy\\orm\\materializer.gleam", 62). -spec materialize_with_hooks( materializer(), row_data(), galchemy@orm@hook:entity_hooks(KHO) ) -> {ok, {galchemy@orm@entity:entity(), materializer()}} | {error, materialization_hook_error(KHO)}. materialize_with_hooks(Materializer, Row_data, Hooks) -> {row_data, Table_ref, Fields} = Row_data, case galchemy@orm@mapper_registry:get( erlang:element(2, Materializer), erlang:element(2, Table_ref), erlang:element(3, Table_ref) ) of {error, Error} -> {error, {materialization_error, {registry_error, Error}}}; {ok, Metadata} -> case galchemy@orm@entity:materialize(Metadata, Fields) of {error, Error@1} -> {error, {materialization_error, {entity_error, Error@1}}}; {ok, Next_entity} -> case galchemy@orm@entity:identity(Next_entity) of {error, Error@2} -> {error, {materialization_error, {entity_error, Error@2}}}; {ok, Next_identity} -> case galchemy@orm@identity_map:get( erlang:element(3, Materializer), erlang:element(2, Metadata), Next_identity ) of {some, Existing_entity} -> {ok, {Existing_entity, Materializer}}; none -> result_try( begin _pipe = galchemy@orm@hook:after_load( Hooks, Next_entity ), map_hook_error(_pipe) end, fun(Hooked_entity) -> case galchemy@orm@identity_map:insert( erlang:element(3, Materializer), Hooked_entity ) of {error, Error@3} -> {error, {materialization_error, {identity_map_error, Error@3}}}; {ok, Next_identities} -> {ok, {Hooked_entity, {materializer, erlang:element( 2, Materializer ), Next_identities}}} end end ) end end end end. -file("src\\galchemy\\orm\\materializer.gleam", 51). -spec materialize(materializer(), row_data()) -> {ok, {galchemy@orm@entity:entity(), materializer()}} | {error, materialization_error()}. materialize(Materializer, Row_data) -> case materialize_with_hooks( Materializer, Row_data, galchemy@orm@hook:none() ) of {ok, Value} -> {ok, Value}; {error, {materialization_error, Error}} -> {error, Error}; {error, {hook_error, _}} -> erlang:error(#{gleam_error => panic, message => <<"unreachable hook error for hook.none()"/utf8>>, file => <>, module => <<"galchemy/orm/materializer"/utf8>>, function => <<"materialize"/utf8>>, line => 58}) end. -file("src\\galchemy\\orm\\materializer.gleam", 145). -spec materialize_many_loop( materializer(), list(row_data()), list(galchemy@orm@entity:entity()) ) -> {ok, {list(galchemy@orm@entity:entity()), materializer()}} | {error, materialization_error()}. materialize_many_loop(Materializer, Rows, Acc) -> case Rows of [] -> {ok, {lists:reverse(Acc), Materializer}}; [Next_row | Rest] -> result_try( materialize(Materializer, Next_row), fun(_use0) -> {Next_entity, Next_materializer} = _use0, materialize_many_loop( Next_materializer, Rest, [Next_entity | Acc] ) end ) end. -file("src\\galchemy\\orm\\materializer.gleam", 119). -spec materialize_many(materializer(), list(row_data())) -> {ok, {list(galchemy@orm@entity:entity()), materializer()}} | {error, materialization_error()}. materialize_many(Materializer, Rows) -> materialize_many_loop(Materializer, Rows, []). -file("src\\galchemy\\orm\\materializer.gleam", 163). -spec materialize_many_with_hooks_loop( materializer(), list(row_data()), galchemy@orm@hook:entity_hooks(KIK), list(galchemy@orm@entity:entity()) ) -> {ok, {list(galchemy@orm@entity:entity()), materializer()}} | {error, materialization_hook_error(KIK)}. materialize_many_with_hooks_loop(Materializer, Rows, Hooks, Acc) -> case Rows of [] -> {ok, {lists:reverse(Acc), Materializer}}; [Next_row | Rest] -> result_try( materialize_with_hooks(Materializer, Next_row, Hooks), fun(_use0) -> {Next_entity, Next_materializer} = _use0, materialize_many_with_hooks_loop( Next_materializer, Rest, Hooks, [Next_entity | Acc] ) end ) end. -file("src\\galchemy\\orm\\materializer.gleam", 126). -spec materialize_many_with_hooks( materializer(), list(row_data()), galchemy@orm@hook:entity_hooks(KHY) ) -> {ok, {list(galchemy@orm@entity:entity()), materializer()}} | {error, materialization_hook_error(KHY)}. materialize_many_with_hooks(Materializer, Rows, Hooks) -> materialize_many_with_hooks_loop(Materializer, Rows, Hooks, []).