-module(cel@interpreter@context). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([empty/0, new_inner/1, insert_variable/3, try_insert_variable/3, insert_function/3, resolve_variable/2, resolve_function/2]). -export_type([function_context/0, callable/0, context/0]). -type function_context() :: {function_context, binary(), gleam@option:option(cel@interpreter@value:value()), context(), list(cel@parser:expression())}. -type callable() :: {callable, fun((function_context()) -> {ok, cel@interpreter@value:value()} | {error, cel@interpreter@error:execution_error()})}. -type context() :: {root, gleam@dict:dict(binary(), cel@interpreter@value:value()), gleam@dict:dict(binary(), callable())} | {child, gleam@dict:dict(binary(), cel@interpreter@value:value()), context()}. -file("/Users/jonas/src/personal/cel-gleam/src/cel/interpreter/context.gleam", 28). -spec empty() -> context(). empty() -> {root, maps:new(), maps:new()}. -file("/Users/jonas/src/personal/cel-gleam/src/cel/interpreter/context.gleam", 32). -spec new_inner(context()) -> context(). new_inner(Ctx) -> Parent = Ctx, {child, maps:new(), Parent}. -file("/Users/jonas/src/personal/cel-gleam/src/cel/interpreter/context.gleam", 50). -spec insert_variable(context(), binary(), cel@interpreter@value:value()) -> context(). insert_variable(Ctx, Name, Value) -> case Ctx of {root, Variables, Functions} -> New_vars = gleam@dict:insert(Variables, Name, Value), {root, New_vars, Functions}; {child, Variables@1, Parent} -> New_vars@1 = gleam@dict:insert(Variables@1, Name, Value), {child, New_vars@1, Parent} end. -file("/Users/jonas/src/personal/cel-gleam/src/cel/interpreter/context.gleam", 37). -spec try_insert_variable(context(), binary(), gleam@dynamic:dynamic_()) -> {ok, context()} | {error, cel@interpreter@error:context_error()}. try_insert_variable(Ctx, Name, Input) -> gleam@result:map( begin _pipe = cel@interpreter@value:decode(Input), gleam@result:map_error(_pipe, fun(Field@0) -> {decode, Field@0} end) end, fun(Value) -> insert_variable(Ctx, Name, Value) end ). -file("/Users/jonas/src/personal/cel-gleam/src/cel/interpreter/context.gleam", 63). -spec insert_function( context(), binary(), fun((function_context()) -> {ok, cel@interpreter@value:value()} | {error, cel@interpreter@error:execution_error()}) ) -> context(). insert_function(Ctx, Name, Func) -> case Ctx of {root, Variables, Functions} -> New_funcs = gleam@dict:insert(Functions, Name, {callable, Func}), {root, Variables, New_funcs}; {child, Variables@1, Parent} -> Parent@1 = insert_function(Parent, Name, Func), {child, Variables@1, Parent@1} end. -file("/Users/jonas/src/personal/cel-gleam/src/cel/interpreter/context.gleam", 80). -spec resolve_variable(context(), binary()) -> {ok, cel@interpreter@value:value()} | {error, cel@interpreter@error:context_error()}. resolve_variable(Ctx, Name) -> case Ctx of {root, Variables, _} -> _pipe = gleam_stdlib:map_get(Variables, Name), gleam@result:replace_error(_pipe, {unknown_identifier, Name}); {child, Variables@1, Parent} -> case gleam_stdlib:map_get(Variables@1, Name) of {error, _} -> resolve_variable(Parent, Name); {ok, Val} -> {ok, Val} end end. -file("/Users/jonas/src/personal/cel-gleam/src/cel/interpreter/context.gleam", 98). -spec resolve_function(context(), binary()) -> {ok, callable()} | {error, cel@interpreter@error:context_error()}. resolve_function(Ctx, Name) -> case Ctx of {root, _, Functions} -> _pipe = gleam_stdlib:map_get(Functions, Name), gleam@result:replace_error(_pipe, {unknown_function, Name}); {child, _, Parent} -> resolve_function(Parent, Name) end.