92 lines
2.1 KiB
Ruby
92 lines
2.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Barong
|
|
class App
|
|
include ActiveSupport::Configurable
|
|
|
|
class Error < ::StandardError; end
|
|
|
|
class << self
|
|
def define
|
|
yield self
|
|
end
|
|
|
|
def set(key, default = nil, options = {})
|
|
value = fetch!(key, default)
|
|
|
|
validate!(key, value, options)
|
|
value = type!(key, value, options)
|
|
|
|
config[key] = value
|
|
end
|
|
|
|
def write(key, value)
|
|
config[key] = value
|
|
end
|
|
|
|
private
|
|
|
|
def fetch!(key, default)
|
|
if env(key)
|
|
return env(key)
|
|
|
|
elsif Rails.application.credentials[key]
|
|
return Rails.application.credentials[key]
|
|
|
|
elsif !default.nil?
|
|
return default
|
|
|
|
else
|
|
raise Error, "Config #{key} missing" if default.nil?
|
|
end
|
|
end
|
|
|
|
def env(key)
|
|
ENV['BARONG_' + key.to_s.upcase]
|
|
end
|
|
|
|
def validate!(key, value, options)
|
|
regex!(key, value, options[:regex]) if options[:regex]
|
|
values!(key, value, options[:values]) if options[:values]
|
|
end
|
|
|
|
def type!(key, value, options)
|
|
return value unless options[:type]
|
|
|
|
case options[:type]
|
|
when :array
|
|
return value.split(',').map { |v| v.squish }
|
|
when :bool
|
|
values!(key, value, %w(true false))
|
|
return value == 'true'
|
|
when :integer
|
|
regex!(key, value, /^\d+$/)
|
|
return value.to_i
|
|
when :path
|
|
return Rails.root.join(value).tap { |p| path!(key, p) }
|
|
when :regexp
|
|
return Regexp.new value
|
|
end
|
|
end
|
|
|
|
def path!(key, path)
|
|
unless File.exists?(path)
|
|
raise Error.new("#{key.to_s.upcase} path is invalid #{path.to_s}")
|
|
end
|
|
end
|
|
|
|
def regex!(key, value, regex)
|
|
unless regex =~ value
|
|
raise Error.new("#{key.to_s.upcase} does not match regex #{regex.inspect}")
|
|
end
|
|
end
|
|
|
|
def values!(key, value, values)
|
|
unless values.include?(value)
|
|
raise Error.new("#{key.to_s.upcase} invalid, enabled values: #{values.to_s}")
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|