class EquipListInfoParser

Constants

MANDATORY_KEYS

Public Class Methods

parse(json, api_version) click to toggle source

装備一覧のみをパースした結果を返します。

# File lib/admiral_stats_parser/parser/equip_list_info_parser.rb, line 14
def self.parse(json, api_version)
  case api_version
    when 1
      # 最初のバージョンには、装備情報の配列のみが入っている
      equip_list = JSON.parse(json)
      unless equip_list.is_a?(Array)
        raise 'json is not an Array'
      end

      parse_equip_list(equip_list)
    when 2
      # 第2のバージョンには、連想配列が入っている
      info = JSON.parse(json)
      unless info.is_a?(Hash)
        raise 'json is not a Hash'
      end

      parse_equip_list(info['equipList'])
  end
end
parse_max_slot_num(json, api_version) click to toggle source

最大装備保有数のみをパースした結果を返します。

# File lib/admiral_stats_parser/parser/equip_list_info_parser.rb, line 36
def self.parse_max_slot_num(json, api_version)
  case api_version
    when 1
      # 最大装備保有数の拡張に対応する前なので、常に 500
      500
    when 2
      info = JSON.parse(json)
      unless info.is_a?(Hash)
        raise 'json is not a Hash'
      end
      info['maxSlotNum']
  end
end

Private Class Methods

parse_equip_list(equip_list) click to toggle source

version 1 の配列、および version 2 の equipList キーの値を受け取り、その結果を EquipListInfo[] に変換して返します。

# File lib/admiral_stats_parser/parser/equip_list_info_parser.rb, line 53
def self.parse_equip_list(equip_list)
  results = []
  equip_list.each do |items|
    result = EquipListInfo.new

    MANDATORY_KEYS.each do |key, key_class|
      # 必須のキーが含まれなければエラー
      camel_case_key = key.to_s.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
      unless items.include?(camel_case_key)
        raise "Mandatory key #{key} does not exist"
      end

      # 結果のクラスが合わなければエラー
      unless items[camel_case_key].is_a?(key_class)
        raise "Mandatory key #{key} is not class #{key_class}"
      end

      result.instance_variable_set("@#{key.to_s}", items[camel_case_key])
    end

    results << result
  end

  results
end