class CopInfoParser

Constants

AREA_DATA_LIST_MANDATORY_KEYS
INDIVIDUAL_ACHIEVEMENT_MANDATORY_KEYS
MANDATORY_KEYS
OPTIONAL_KEYS

Public Class Methods

parse(json, api_version) click to toggle source
# File lib/admiral_stats_parser/parser/cop_info_parser.rb, line 32
def self.parse(json, api_version)
  items = JSON.parse(json)

  # イベント期間外はnilを返す
  return nil if items.empty?

  result = CopInfo.new

  MANDATORY_KEYS[api_version].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

    # 結果のクラスが合わなければエラー
    # 海域撃破ボーナスを格納するために、特別な処理を追加
    if key_class == :individual_achievement
      result.instance_variable_set(
          "@#{key.to_s}", CopInfoParser.parse_individual_achievement(items[camel_case_key]))
      next
    elsif key_class == :area_data_list
      result.instance_variable_set(
          "@#{key.to_s}", CopInfoParser.parse_area_data_list(items[camel_case_key]))
      next
    end

    # ruby には Boolean クラスがないので、そこだけ特別な処理を用意する
    if key_class == :boolean
      unless [true, false].include?(items[camel_case_key])
        raise "Mandatory key #{key} is not boolean"
      end
    else
      unless items[camel_case_key].is_a?(key_class)
        raise "Mandatory key #{key} is not class #{key_class}"
      end
    end

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

  OPTIONAL_KEYS[api_version].each do |key, key_class|
    # キーが含まれなければ、処理をスキップ
    camel_case_key = key.to_s.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
    next unless items.include?(camel_case_key)

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

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

  result
end
parse_area_data_list(area_data_list) click to toggle source
# File lib/admiral_stats_parser/parser/cop_info_parser.rb, line 116
def self.parse_area_data_list(area_data_list)
  results = []

  area_data_list.each do |area_data|
    result = CopInfo::CopInfoAreaData.new

    AREA_DATA_LIST_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 area_data.include?(camel_case_key)
        raise "Mandatory key #{key} does not exist"
      end

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

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

    results << result
  end

  results
end
parse_individual_achievement(achievements) click to toggle source
# File lib/admiral_stats_parser/parser/cop_info_parser.rb, line 89
def self.parse_individual_achievement(achievements)
  results = []

  achievements.each do |achievement|
    result = CopInfo::CopInfoIndividualAchievement.new

    INDIVIDUAL_ACHIEVEMENT_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 achievement.include?(camel_case_key)
        raise "Mandatory key #{key} does not exist"
      end

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

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

    results << result
  end

  results
end