Files

188 lines
4.5 KiB
Ruby

module TAC
class Config
attr_reader :name, :configuration, :groups, :presets
def initialize(name)
@name = name
@configuration = nil
@groups = nil
@presets = nil
parse(File.read("#{TAC::CONFIGS_PATH}/#{name}.json"))
end
def parse(json)
data = JSON.parse(json, symbolize_names: true)
if data.is_a?(Array)
parse_original_config(data)
elsif data.is_a?(Hash) && data.dig(:config, :spec_version) == TAC::CONFIG_SPEC_VERSION
parse_spec_current(data)
else
raise "Unable to load config."
end
end
def parse_original_config(data)
end
def parse_spec_current(data)
@configuration = Configuration.from_json(data[:config])
@groups = data.dig(:data, :groups).map { |g| Group.from_json(g) }
@presets = Presets.from_json(data.dig(:data, :presets))
end
def to_json(*args)
{
config: @configuration,
data: {
groups: @groups,
presets: @presets,
}
}.to_json(*args)
end
class Configuration
attr_accessor :created_at, :updated_at, :spec_version, :revision
def initialize(created_at:, updated_at:, spec_version:, revision:)
@created_at, @updated_at = created_at, updated_at
@spec_version = spec_version
@revision = revision
end
def to_json(*args)
{
created_at: @created_at,
updated_at: @updated_at,
spec_version: @spec_version,
revision: @revision,
}.to_json(*args)
end
def self.from_json(hash)
Configuration.new(
created_at: hash[:created_at],
updated_at: hash[:updated_at],
spec_version: hash[:spec_version],
revision: hash[:revision],
)
end
end
class Presets
attr_reader :groups, :actions
def initialize(groups:, actions:)
@groups, @actions = groups, actions
end
def to_json(*args)
{
groups: @groups,
actions: @actions,
}.to_json(*args)
end
def self.from_json(hash)
Presets.new(
groups: hash[:groups].map { |group| Group.from_json(group) },
actions: hash[:actions].map { |action| Action.from_json(action) },
)
end
end
class Group
attr_accessor :name
attr_reader :actions
def initialize(name:, actions:)
@name = name
@actions = actions
end
def to_json(*args)
{
name: @name,
actions: @actions
}.to_json(*args)
end
def self.from_json(hash)
Group.new(name: hash[:name], actions: hash[:actions].map { |a| Action.from_json(a) })
end
end
class Action
attr_accessor :name, :comment, :enabled
attr_reader :variables
def initialize(name:, comment:, enabled:, variables:)
@name, @comment, @enabled = name, comment, enabled
@variables = variables
end
def to_json(*args)
{
name: @name,
comment: @comment,
enabled: @enabled,
variables: @variables
}.to_json(*args)
end
def self.from_json(hash)
Action.new(name: hash[:name], comment: hash[:comment], enabled: hash[:enabled], variables: hash[:variables].map { |h| Variable.from_json(h) })
end
end
class Variable
attr_accessor :name, :type, :value
def initialize(name:, type:, value:)
@name, @type, @value = name, type, value
end
def to_json(*args)
{
name: @name,
value: "#{Variable.encode_type(@type)}x#{@value}"
}.to_json(*args)
end
def self.from_json(hash)
type, value = hash[:value].split("x", 2)
type = Variable.decode_type(type)
Variable.new(name: hash[:name], type: type, value: value)
end
def self.encode_type(symbol)
symbol.to_s.chars.first.upcase
end
def self.decode_type(character)
case character.upcase
when "I"
:integer
when "F"
:float
when "D"
:double
when "L"
:long
when "S"
:string
when "B"
:boolean
end
end
def self.decode_value(type, string)
case type
when "I", "L", :integer, :long
Integer(string)
when "F", "D", :float, :double
Float(string)
when "S", :string
string
when "B", :boolean
string.downcase == "true"
end
end
end
end
end