Sha256: 15d2e2d297dffd85b73a0106027eb1c939984810de83a9f10137937e6c0ce8e6
Contents?: true
Size: 1.41 KB
Versions: 8
Compression:
Stored size: 1.41 KB
Contents
module Main module Cast def self.export m module_function m public m end List = [] def self.cast m, &b define_method m, &b export m List << m.to_s end cast :boolean do |obj| case obj.to_s when 'true' true when 'false' false else !!obj end end cast :integer do |obj| Integer obj end cast :float do |obj| Float obj end cast :number do |obj| Float obj rescue Integer obj end cast :string do |obj| String obj end cast :uri do |obj| require 'uri' ::URI.parse obj.to_s end cast :list do |*objs| [*objs].flatten.join(',').split(/,/) end List.dup.each do |type| next if type.to_s == 'list' m = "list_of_#{ type }" define_method m do |*objs| list(*objs).map{|obj| send type, obj} end export m List << m end def self.[] sym prefix = sym.to_s.downcase.to_sym candidates = List.select{|m| m =~ %r/^#{ prefix }/i} m = candidates.shift raise ArgumentError, "unsupported cast: #{ sym.inspect } (#{ List.join ',' })" unless m raise ArgumentError, "ambiguous cast: #{ sym.inspect } (#{ List.join ',' })" unless candidates.empty? or m.to_s == sym.to_s this = self lambda{|obj| method(m).call obj} end end end
Version data entries
8 entries across 8 versions & 1 rubygems