Current section
Files
Jump to
Current section
Files
src/cel@interpreter@context.erl
-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.