71 lines
1.6 KiB
Ruby
71 lines
1.6 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "json"
|
|
|
|
module ClashDeckGenerator2
|
|
module Services
|
|
class CardRolesRepository
|
|
ROLES_PATH = File.expand_path("../../config/cards/roles.json", __dir__)
|
|
|
|
def all
|
|
@all ||= load_roles
|
|
end
|
|
|
|
def cards
|
|
all.fetch("cards", {})
|
|
end
|
|
|
|
def roles_for(card_name)
|
|
cards.fetch(card_name, [])
|
|
end
|
|
|
|
def has_role?(card_name, role)
|
|
roles_for(card_name).include?(role)
|
|
end
|
|
|
|
def meta
|
|
all.fetch("_meta", {})
|
|
end
|
|
|
|
private
|
|
|
|
def load_roles
|
|
raise "roles.json not found: #{ROLES_PATH}" unless File.exist?(ROLES_PATH)
|
|
|
|
parsed = JSON.parse(File.read(ROLES_PATH))
|
|
|
|
unless parsed.is_a?(Hash)
|
|
raise "roles.json must contain a JSON object at root"
|
|
end
|
|
|
|
unless parsed.key?("cards")
|
|
raise 'roles.json must contain "cards" key'
|
|
end
|
|
|
|
cards = parsed["cards"]
|
|
|
|
unless cards.is_a?(Hash)
|
|
raise '"cards" must be a JSON object'
|
|
end
|
|
|
|
cards.each do |card_name, roles|
|
|
unless card_name.is_a?(String) && !card_name.strip.empty?
|
|
raise "Invalid card name in roles.json: #{card_name.inspect}"
|
|
end
|
|
|
|
unless roles.is_a?(Array)
|
|
raise "Roles for #{card_name} must be an array"
|
|
end
|
|
|
|
roles.each do |role|
|
|
unless role.is_a?(String) && !role.strip.empty?
|
|
raise "Invalid role for #{card_name}: #{role.inspect}"
|
|
end
|
|
end
|
|
end
|
|
|
|
parsed
|
|
end
|
|
end
|
|
end
|
|
end |