Sha256: ebf186f6d33268fc4a77c55344b81563eb48ad87ae81a494d66ced349fa01622
Contents?: true
Size: 1.67 KB
Versions: 5
Compression:
Stored size: 1.67 KB
Contents
require "mvcli/form" require "active_support/inflector/methods" class MVCLI::Form::Input def initialize(name, target, options = {}, &block) @decoders = [] @handler = handler(target).new name, target, options, &block end def decode(&block) @handler.decode &block end def value(source, context = nil, &transform) transform ||= ->(v) { v } @handler.value source, context, &transform end def handler(target) target.is_a?(Array) ? ListTarget : Target end class Target def initialize(name, target, options = {}, &block) @name, @options = name, Map(options) @decoders = [] if block_given? @decoders << block end end def decode(&block) @decoders << block end def value(source, context = nil, &transform) transform.call decoded source, context end def decoded(source, context) if value = [source[@name]].flatten.first @decoders.reduce(value) do |value, decoder| decoder.call value end else default context end end def default(context) value = @options[:default] if value.respond_to?(:call) if context context.instance_exec(&value) else value.call end else value end end end class ListTarget < Target include ActiveSupport::Inflector def value(source, context = nil, &transform) source = Map(source) list = [source[singularize @name]].compact.flatten.map do |value| super({@name => value}, context, &transform) end.compact list.empty? ? [transform.call(default(context))].compact.flatten : list end end end
Version data entries
5 entries across 5 versions & 1 rubygems
Version | Path |
---|---|
mvcli-0.0.14 | lib/mvcli/form/input.rb |
mvcli-0.0.13 | lib/mvcli/form/input.rb |
mvcli-0.0.12 | lib/mvcli/form/input.rb |
mvcli-0.0.11 | lib/mvcli/form/input.rb |
mvcli-0.0.10 | lib/mvcli/form/input.rb |