lib/confuse/item.rb in confuse-1.0.0 vs lib/confuse/item.rb in confuse-1.1.0

- old
+ new

@@ -4,17 +4,69 @@ # An {Item} is a class for storing a description piece of config. class Item def initialize(key, opts = {}) @key = key @default, @description = opts.values_at(:default, :description) + + @converter = opts[:converter] + @type = opts[:type] + @required = opts.key?(:required) ? opts[:required] : true end - attr_reader :description, :required + attr_reader :description, :required, :converter - def default - res = @default - raise Errors::Undefined.new(@key) if @required && !res - res + def convert(value) + converter.call(value) + end + + def default(config) + raise Errors::Undefined.new(@key) if @required && !@default + + res = if @default.respond_to?(:call) + @default.call(config) + else + @default + end + end + + def to_s + default = if @default && !@default.respond_to?(:call) + "default: #{@default}" + else + '' + end + "#{@key}:\t#{description} #{default}" + end + + def to_hash + { + :description => @description, + :default => @default + } + end + + private + + def type + @type || type_from_default || String + end + + def type_from_default + if @default + klass = @default.class + case @default + when TrueClass, FalseClass + :bool + when Proc + String + else + @default.class + end + end + end + + def converter + @converter ||= Converter[type] end end end