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