Sha256: ef64db7ff856a8f320e040733ee9e74d89e52b2f106453de96d56406a9a34b47

Contents?: true

Size: 1.74 KB

Versions: 2

Compression:

Stored size: 1.74 KB

Contents

# Master class

class Typero
  class Type
    ERRORS = {
      en: {
        # errors shared between various types
        min_length_error: 'min lenght is %s, you have %s',
        max_length_error: 'max lenght is %s, you have %s',
        min_value_error: 'min is %s, got %s',
        max_value_error: 'max is %s, got %s',
        unallowed_characters_error: 'is having unallowed characters'
      }
    }

    OPTS = {}

    attr_accessor :opts
    attr_accessor :value

    class << self
      def load name
        klass = 'Typero::%sType' % name.to_s.gsub(/[^\w]/,'').classify

        if const_defined? klass
          klass.constantize
        else
          raise ArgumentError, 'Typero type "%s" is not defined (%s)' % [name, klass]
        end
      end

      def error locale, key, message
        locale = locale.to_sym
        ERRORS[locale] ||= {}
        ERRORS[locale][key.to_sym] = message
      end

      def opts key, desc
        OPTS[self] ||= {}
        OPTS[self][key] = desc
      end
    end

    ###

    def initialize value, opts={}
      @value = value
      @opts  = opts
    end

    # default validation for any type
    def validate
      true
    end

    def default
      nil
    end

    private

    # get error from option or the default one
    def error_for name, *args
      locale =
      if defined?(Lux)
        Lux.current.locale.to_s
      elsif defined?(I18n)
        I18n.locale
      end

      locale  = :en if locale.to_s == ''
      pointer = ERRORS[locale.to_sym] || ERRORS[:en]
      error   = @opts.dig(:meta, locale, name) || @opts.dig(:meta, name) || pointer[name]
      error   = error % args if args.first

      raise 'Type error :%s not defined' % name unless error
      raise TypeError.new(error)
    end
  end
end


Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
typero-0.8.1 ./lib/typero/type/type.rb
typero-0.8.0 ./lib/typero/type/type.rb