Sha256: 82eba67054e6e10a371d299569a6eaffd895c22933c56e6a68395a5c3dbaad2b

Contents?: true

Size: 1.57 KB

Versions: 2

Compression:

Stored size: 1.57 KB

Contents

require "king_konf/decoder"

module KingKonf
  class Variable
    attr_reader :name, :type, :default, :description, :allowed_values, :options

    def initialize(name:, type:, default: nil, description: "", required: false, allowed_values: nil, options: {})
      @name, @type = name, type
      @description = description
      @required = required
      @allowed_values = allowed_values
      @options = options
      @default = cast(default)
    end

    def cast(value)
      case @type
      when :float then value.to_f
      when :duration then value.is_a?(String) ? Decoder.duration(value) : value
      when :symbol then value.is_a?(String) ? value.to_sym : value
      else value
      end
    end

    def required?
      @required
    end

    def valid?(value)
      case @type
      when :string then value.is_a?(String) || value.nil?
      when :list then value.is_a?(Array)
      when :integer then value.is_a?(Integer) || value.nil?
      when :float then value.is_a?(Float) || value.is_a?(Integer) || value.nil?
      when :duration then value.is_a?(Float) || value.is_a?(Integer) || value.is_a?(String) || value.nil?
      when :boolean then value == true || value == false
      when :symbol then value.is_a?(Symbol) || value.is_a?(String)
      else raise "invalid type #{@type}"
      end
    end

    def allowed?(value)
      allowed_values.nil? || allowed_values.include?(value)
    end

    def decode(value)
      Decoder.public_send(@type, value, **options)
    end

    TYPES.each do |type|
      define_method("#{type}?") do
        @type == type
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
king_konf-0.3.5 lib/king_konf/variable.rb
king_konf-0.3.4 lib/king_konf/variable.rb