Current section

Files

Jump to
membrane_core lib membrane core inspect.ex
Raw

lib/membrane/core/inspect.ex

defmodule Membrane.Core.Inspect do
@moduledoc false
alias Inspect.Algebra
alias Membrane.Core.Component
@doc """
A function, that inspects passed state sorting its fields withing the order in which
they occur in the list passed to `defstruct`.
"""
@spec inspect(Component.state(), Inspect.Opts.t()) :: Inspect.Algebra.t()
def inspect(%state_module{} = state, opts) do
ordered_fields =
state_module.__info__(:struct)
|> Enum.map(& &1.field)
field_to_doc_fun =
fn field, opts ->
value_doc =
Map.fetch!(state, field)
|> Algebra.to_doc(opts)
Algebra.concat("#{Atom.to_string(field)}: ", value_doc)
end
Algebra.container_doc(
"%#{Kernel.inspect(state_module)}{",
ordered_fields,
"}",
opts,
field_to_doc_fun,
break: :strict
)
end
end
[Pipeline, Bin, Element]
|> Enum.map(fn component ->
state_module = Module.concat([Membrane.Core, component, State])
defimpl Inspect, for: state_module do
@spec inspect(unquote(state_module).t(), Inspect.Opts.t()) :: Inspect.Algebra.t()
defdelegate inspect(state, opts), to: Membrane.Core.Inspect
end
end)