Packages
membrane_core
0.11.5
1.3.4
1.3.3
1.3.2
1.3.1
1.3.0
1.2.7
1.2.6
1.2.5
retired
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.2.0-rc1
1.1.2
1.1.1
1.1.0
1.1.0-rc1
1.1.0-rc0
1.0.1
1.0.0
1.0.0-rc1
1.0.0-rc0
0.12.9
0.12.8
0.12.7
0.12.6
0.12.5
0.12.4
0.12.3
0.12.2
0.12.1
0.12.0
retired
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.2
0.10.1
0.10.0
0.9.0
0.8.2
0.8.1
0.8.0
0.7.0
0.6.1
0.6.0
0.5.3
0.5.2
0.5.1
0.5.0
0.4.3
0.4.2
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.2
0.2.1
0.2.0
0.1.1
0.1.0
Membrane Multimedia Framework (Core)
Current section
Files
Jump to
Current section
Files
lib/membrane/core/callback_context.ex
defmodule Membrane.Core.CallbackContext do
@moduledoc false
@callback extract_default_fields(state :: Macro.t(), args :: keyword(Macro.t())) ::
keyword(Macro.t())
defmacro __using__(default_fields) do
quote do
@behaviour unquote(__MODULE__)
@type default_fields :: %{unquote_splicing(default_fields)}
@impl true
def extract_default_fields(_state, args) do
args
end
defoverridable unquote(__MODULE__)
@macrocallback from_state(state :: Macro.t(), args :: keyword(Macro.t())) :: Macro.t()
unquote(nested_using({:quote, [], [[do: default_fields]]}))
end
end
defp nested_using(default_fields) do
quote do
defmacro __using__(fields) do
default_fields = unquote(default_fields)
quote do
require unquote(__MODULE__)
@behaviour unquote(__MODULE__)
@type t :: %__MODULE__{unquote_splicing(fields ++ default_fields)}
fields_names = unquote(Keyword.keys(fields))
default_fields_names = unquote(Keyword.keys(default_fields))
@enforce_keys Module.get_attribute(__MODULE__, :enforce_keys, fields_names) ++
default_fields_names
defstruct fields_names ++ default_fields_names
@impl true
defmacro from_state(state, args \\ []) do
module = unquote(__MODULE__)
quote do
require unquote(module)
%unquote(__MODULE__){
unquote_splicing(module.extract_default_fields(state, args))
}
end
end
defoverridable unquote(__MODULE__)
end
end
end
end
end