Sha256: b8b6b1468b094b31d83c982e751e8b78d44f8514b8e2e47fbdb5f9fa9fae3134

Contents?: true

Size: 1.23 KB

Versions: 1

Compression:

Stored size: 1.23 KB

Contents

class Joshua
  module Params
    class Define
      def initialize
        @opts = { }
      end

      def method_missing name, *args
        name = name.to_s

        raise ArgumentError.new('! is not allowed in params') if name.include?('!')

        type, opts = args

        if type.is_a?(Hash)
          opts = args.first
          type = :string
        end

        type = :string if type.nil?

        opts ||= {}
        opts[:type] = type.to_s.dasherize.downcase.to_sym

        opts[:required] = true if opts[:required].nil?
        opts[:required] = false if name.sub! /\?$/, ''
        opts[:required] = false if opts.delete(:optional)

        opts.merge!(type: :boolean, default: false) if opts[:type] == :false
        opts.merge!(type: :boolean, default: true) if opts[:type] == :true
        opts[:required] = false if opts[:type] == :boolean

        @opts[:params] ||= {}
        @opts[:params][name.to_sym] = opts
      end

      def fetch_and_clear_opts
        @opts
          .dup
          .tap { @opts = {} }
      end

      def __add name, value=true
        @opts[name] = value
      end

      def __add_annotation name, data
        @opts[:annotations] ||= {}
        @opts[:annotations][name] = data
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
joshua-0.1.0 ./lib/joshua/params/define.rb