Sha256: 7e98c0cb24d5473bd1c4908648c4027541ac8de4257831f7d4d37126251b1ba3

Contents?: true

Size: 1.85 KB

Versions: 3

Compression:

Stored size: 1.85 KB

Contents

module MaskableAttribute
  module Formatting
    class Formats < Hash

      #{ :format => :two_digit }
      #{ :formats => [ :upcase, :downcase ] }
      #{ :exclusive_format => { :capitalized => Proc.new{ |mask| mask.captialized } } }
      #{ :exclusive_formats =>{ :capitalized => Proc.new{ |mask| mask.captialized }, :titleized => :titleize } }
      #{ :default_format => :titleize }
      attr_accessor :are_exclusive, :has_default, :default
      def initialize(options = {})
        @are_exclusive, @has_default = false, false
        @default = nil
        unless options.nil?
          options.each do |type, formats|
            if formats.is_a? Symbol or formats.is_a? Proc
              self[formats] = Format.new formats
            elsif formats.is_a? Array
              formats.each do |format|
                self[format] = Format.new format
              end
            else
              formats.each do |format, method|
                self[format] = Format.new method || format
              end
            end

            if type.to_s.include? "exclusive"
              @are_exclusive = true
            elsif type.to_s.include? "default"
              @has_default = true
              @default = self[formats]
            end
          end
        end
      end

      def apply(format, &block)
        fetch(format, (has_default? ? @default : Format.new)).apply yield unless yield.nil?
      end

      def names
        keys
      end

      def are_exclusive?
        @are_exclusive
      end

      def has_default?
        @has_default
      end
    end

    class Format
      def initialize(method=nil)
        @method = method
      end

      def apply(input)
        if @method.is_a? Symbol
          input.send(@method)
        elsif @method.is_a? Proc
          @method.call input
        else
          input
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
maskable_attribute-0.0.3 lib/maskable_attribute/formatting.rb
maskable_attribute-0.0.2 lib/maskable_attribute/formatting.rb
maskable_attribute-0.0.1 lib/maskable_attribute/formatting.rb