lib/micro/struct/features.rb in u-struct-0.11.0 vs lib/micro/struct/features.rb in u-struct-0.12.0
- old
+ new
@@ -1,31 +1,55 @@
# frozen_string_literal: true
module Micro::Struct
module Features
- DISABLED =
- { to_ary: false,
- to_hash: false,
- to_proc: false,
- readonly: false,
- instance_copy: false }.freeze
+ Names = ->(values) do
+ NormalizeNames::AsSymbols.(values, context: 'feature')
+ end
- Check = ->(to_ary:, to_hash:, to_proc:, readonly:, instance_copy:) do
- { to_ary: to_ary,
- to_hash: to_hash,
- to_proc: to_proc,
- readonly: readonly,
- instance_copy: instance_copy }
+ module Options
+ def self.check(to_ary:, to_hash:, to_proc:, readonly:, instance_copy:, exposed_features:)
+ { to_ary: to_ary,
+ to_hash: to_hash,
+ to_proc: to_proc,
+ readonly: readonly,
+ instance_copy: instance_copy,
+ exposed_features: exposed_features }
+ end
+
+ With = ->(bool, names) { names.each_with_object({}) { |name, memo| memo[name] = bool } }
+
+ DISABLED = With.(false, method(:check).parameters.map(&:last)).freeze
+
+ def self.from_names(values)
+ enabled = With.(true, values)
+
+ check(**DISABLED.merge(enabled))
+ end
end
- Names = ->(values) do
- NormalizeNames::AsSymbols.(values, context: 'feature')
+ Config = ::Struct.new(:names, :options) do
+ def option?(name)
+ options.fetch(name)
+ end
+
+ def options?(*names)
+ names.all? { |name| option?(name) }
+ end
end
- def self.require(values)
- to_enable = Names[values].each_with_object({}) { |name, memo| memo[name] = true }
+ Exposed = Class.new(Config)
- Check.(**DISABLED.merge(to_enable))
+ def self.config(values)
+ names = Names[values]
+ options = Options.from_names(names)
+
+ return Config.new(names, options) unless options[:exposed_features]
+
+ names.delete(:exposed_features)
+ options.delete(:exposed_features)
+
+ Exposed.new(names.freeze, options.freeze).freeze
end
end
private_constant :Features
end