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