@type result_t() :: struct() | map()
@type t() :: module()
@callback unmarshal(bitstring(), boolean()) :: {:ok, result_t()} | {:error, any()}