class FMCache::Decoder

Attributes

field_mask_parser[R]
fields_checker[R]
value_decoder[R]

Public Class Methods

new(field_mask_parser) click to toggle source

@param [Proc] field_mask_parser

# File lib/fmcache/decoder.rb, line 8
def initialize(field_mask_parser)
  @field_mask_parser = field_mask_parser
  @value_decoder     = ValueDecoder.new
  @fields_checker    = FieldsChecker.new
end

Public Instance Methods

decode(hash, field_mask) click to toggle source

@param [{ String => { String => <Hash> } }] hash @param [FieldMaskParser::Node] field_mask @return [<Hash>, <Hash>, IncompleteInfo]

# File lib/fmcache/decoder.rb, line 19
def decode(hash, field_mask)
  list = hash.values
  check_result = fields_checker.check(list, field_mask)

  decode_result = decode_list(check_result.list, field_mask: field_mask)

  f = Helper.to_fields(field_mask) - check_result.missing_fields.to_a
  i_decode_result = decode_list(check_result.incomplete_list, fields: f)

  concat(check_result, decode_result, i_decode_result)
end

Private Instance Methods

concat(check_result, decode_result, invalid_decode_result) click to toggle source

@param [FieldsChecker::CheckResult] decode_result @param [DecodeResult] decode_result @param [DecodeResult] invalid_decode_result @return [<Hash>, <Hash>, IncompleteInfo]

# File lib/fmcache/decoder.rb, line 70
def concat(check_result, decode_result, invalid_decode_result)
  v = decode_result.values
  i_v = decode_result.invalid_values +
    invalid_decode_result.values +
    invalid_decode_result.invalid_values

  missing_fields = Set.new(
    check_result.missing_fields +
    decode_result.invalid_fields +
    invalid_decode_result.invalid_fields
  )
  incomplete_info = IncompleteInfo.new(
    ids:        i_v.map { |h| h.fetch(:id) },
    field_mask: field_mask_parser.call(missing_fields),
  )

  [v, i_v, incomplete_info]
end
decode_list(list, field_mask: nil, fields: nil) click to toggle source

@param [<Hash>] list @param [FieldMaskParser::Node] field_mask @param [<String>] fields @return [DecodeResult]

# File lib/fmcache/decoder.rb, line 37
def decode_list(list, field_mask: nil, fields: nil)
  if field_mask.nil? && fields.nil?
    raise "invalid args!"
  end
  if fields
    field_mask = field_mask_parser.call(fields)
  end

  values         = []
  invalid_values = []
  invalid_fields = Set.new

  list.each do |d|
    v, i_fields = value_decoder.decode(d, field_mask)
    if i_fields.size == 0
      values << v
    else
      invalid_values << v
      invalid_fields |= i_fields
    end
  end

  DecodeResult.new(
    values:         values,
    invalid_values: invalid_values,
    invalid_fields: invalid_fields,
  )
end