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

Version Path
main-2.3.0 lib/main/cast.rb
main-2.0.0 lib/main/cast.rb
main-2.4.0 lib/main/cast.rb
main-0.0.1 lib/main/cast.rb
main-0.0.2 lib/main/cast.rb
main-2.1.0 lib/main/cast.rb
main-2.2.0 lib/main/cast.rb
main-2.5.0 lib/main/cast.rb