Current section

Files

Jump to
rustq lib rustq codegen helpers.ex
Raw

lib/rustq/codegen/helpers.ex

defmodule RustQ.Codegen.Helpers do
@moduledoc """
General Rust helper functions emitted into RustQ's native support crate.
"""
use RustQ.Codegen.DefrustModule,
callable_modules: [RustQ.Codegen.ModuleHelpers]
@spec required_field(term(), R.str()) :: R.nif_result(term())
defrust required_field(term, key) do
term.map_get(atom(term.get_env(), key))
end
@spec optional_map_get(term(), R.str()) :: R.nif_result(R.option(term()))
defrust optional_map_get(term, key) do
case term.map_get(unwrap!(atom(term.get_env(), key))) do
{:ok, value} -> {:ok, some(value)}
{:error, _reason} -> {:ok, nil}
end
end
@spec atom_key(term(), R.str()) :: R.nif_result(String.t())
defrust atom_key(term, key) do
term.map_get(atom(term.get_env(), key)).atom_to_string()
end
@spec optional_atom_key(term(), R.str()) :: R.nif_result(R.option(String.t()))
defrust optional_atom_key(term, key) do
value = unwrap!(term.map_get(unwrap!(atom(term.get_env(), key))))
if unwrap!(is_nil(value)) do
{:ok, nil}
else
{:ok, some(unwrap!(value.atom_to_string()))}
end
end
@spec is_nil(term()) :: R.nif_result(boolean())
defrust is_nil(term) do
{:ok, term.is_atom() and unwrap!(term.atom_to_string()) == "nil"}
end
@spec struct_name(term()) :: R.nif_result(String.t())
defrust struct_name(term) do
term.map_get(atom(term.get_env(), "__struct__")).atom_to_string()
end
@spec expect_struct(term(), R.str()) :: R.nif_result(R.unit())
defrust expect_struct(term, expected) do
if unwrap!(struct_name(term)) == expected do
:ok
else
{:error, badarg()}
end
end
end