class ReeDao::PgJsonb

def db_dump(value, name:, role: nil, fields_filters: [])

def db_dump(value, name:, role: nil, fields_filters: [])
  value = subject.type.db_dump(
    value,
    name: name,
    role: role,
    fields_filters: fields_filters + [subject.fields_filter]
  )
  begin
    Sequel.pg_jsonb_wrap(value)
  rescue Sequel::Error
    raise ReeMapper::TypeError, "`#{name}` should be an jsonb primitive"
  end
end

def db_load(value, name:, role: nil, fields_filters: [])

def db_load(value, name:, role: nil, fields_filters: [])
  value = case value
  when Sequel::Postgres::JSONBHash
    ReeObject::ToHash.new.call(value.to_h)
  when Sequel::Postgres::JSONBArray
    ReeObject::ToHash.new.call(value.to_a)
  when Numeric, String, TrueClass, FalseClass, NilClass
    value
  else
    raise ReeMapper::TypeError, "`#{name}` is not Sequel::Postgres::JSONB"
  end
  subject.type.db_load(
    value,
    name: name,
    role: role,
    fields_filters: fields_filters + [subject.fields_filter]
  )
end