Current section

Files

Jump to
bin_struct lib bin_struct macro registered_callback_arguments_binding.ex
Raw

lib/bin_struct/macro/registered_callback_arguments_binding.ex

defmodule BinStruct.Macro.RegisteredCallbackArgumentsBinding do
@moduledoc false
alias BinStruct.Macro.Structs.RegisteredCallback
alias BinStruct.Macro.Structs.RegisteredOption
alias BinStruct.Macro.Structs.RegisteredCallbackFieldArgument
alias BinStruct.Macro.Structs.RegisteredCallbackOptionArgument
alias BinStruct.Macro.Structs.Field
alias BinStruct.Macro.Structs.VirtualField
alias BinStruct.Macro.Bind
alias BinStruct.TypeConversion.TypeConversionManaged
alias BinStruct.TypeConversion.TypeConversionUnmanaged
alias BinStruct.TypeConversion.TypeConversionBinary
alias BinStruct.TypeConversion.TypeConversionUnspecified
def registered_callback_arguments_bindings(
%RegisteredCallback{ arguments: arguments },
context
) do
Enum.map(
arguments,
fn argument ->
case argument do
%RegisteredCallbackFieldArgument{ field: %Field{} } = argument ->
arguments_bindings_for_field_argument(argument, context)
%RegisteredCallbackFieldArgument{ field: %VirtualField{} } = argument ->
arguments_bindings_for_virtual_field_argument(argument, context)
%RegisteredCallbackOptionArgument{
registered_option: %RegisteredOption {
interface: interface,
name: name
}
} -> Bind.bind_option(interface, name, context)
end
end
)
end
defp arguments_bindings_for_field_argument(argument, context) do
%RegisteredCallbackFieldArgument{ field: field, type_conversion: type_conversion } = argument
%Field { name: name } = field
case type_conversion do
TypeConversionUnmanaged -> Bind.bind_unmanaged_value(name, context)
TypeConversionManaged -> Bind.bind_managed_value(name, context)
TypeConversionBinary -> Bind.bind_binary_value(name, context)
TypeConversionUnspecified -> Bind.bind_managed_value(name, context)
end
end
defp arguments_bindings_for_virtual_field_argument(argument, context) do
%RegisteredCallbackFieldArgument{ field: virtual_field, type_conversion: type_conversion } = argument
%VirtualField { name: name } = virtual_field
case type_conversion do
TypeConversionUnmanaged -> Bind.bind_unmanaged_value(name, context)
TypeConversionManaged -> Bind.bind_managed_value(name, context)
TypeConversionBinary -> Bind.bind_binary_value(name, context)
TypeConversionUnspecified -> Bind.bind_managed_value(name, context)
end
end
end