lib/micro/struct/features.rb in u-struct-1.0.0 vs lib/micro/struct/features.rb in u-struct-1.1.0

- old
+ new

@@ -1,48 +1,43 @@ +# typed: true # frozen_string_literal: true module Micro::Struct module Features - Names = ->(values) do - NormalizeNames::AsSymbols.(values, context: 'feature') - end - 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 + def self.from(names:) + options = names.each_with_object({}) { |name, memo| memo[name] = true } - 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)) + { + to_ary: options.fetch(:to_ary, false), + to_hash: options.fetch(:to_hash, false), + to_proc: options.fetch(:to_proc, false), + readonly: options.fetch(:readonly, false), + instance_copy: options.fetch(:instance_copy, false), + exposed_features: options.fetch(:exposed_features, false) + } end end Config = ::Struct.new(:names, :options) do def option?(name) options.fetch(name) end - + def options?(*names) names.all? { |name| option?(name) } end end Exposed = Class.new(Config) + Names = ->(values) do + NormalizeNames::AsSymbols.(values, context: 'feature') + end + def self.config(values) names = Names[values] - options = Options.from_names(names) + options = Options.from(names: names) return Config.new(names, options) unless options[:exposed_features] names.delete(:exposed_features) options.delete(:exposed_features)