Sha256: 8a89a0e3335aa1c9fee93c0ae44a7d7f3c09938287b805ecab9b8022da0241fb

Contents?: true

Size: 1.74 KB

Versions: 6

Compression:

Stored size: 1.74 KB

Contents

# frozen_string_literal: true

require_relative 'parameters_builder'
require_relative 'uniformed_params_builder'

module Meta
  module RouteDSL
    class MetaBuilder
      def initialize(&block)
        @meta = {}

        instance_exec &block if block_given?
      end

      def build
        @meta
      end

      def parameters(&block)
        @meta[:parameters] = ParametersBuilder.new(&block).build
      end

      def request_body(options = {}, &block)
        @meta[:request_body] = JsonSchema::SchemaBuilderTool.build(options, &block)
      end

      # params 宏是一个遗留的宏,它在一个宏定义块内同时定义 parameters 和 request_body
      def params(&block)
        @meta[:parameters], @meta[:request_body] = UniformedParamsBuilder.new(&block).build
      end

      def status(code, *other_codes, &block)
        codes = [code, *other_codes]
        entity_schema = JsonSchema::SchemaBuilderTool.build(&block)
        @meta[:responses] = @meta[:responses] || {}
        codes.each { |code| @meta[:responses][code] = entity_schema }
      end

      [:tags, :title, :description].each do |method_name|
        define_method(method_name) do |value|
          @meta[method_name] = value
        end
      end

      # 别的模块引入该模块时可直接调用 MetaBuilder 的方法。
      # 由于该模块是动态实现的,其务必要在 MetaBuilder 类构建完毕后再声明,故而放在文件的最后声明。
      module Delegator
        method_names = MetaBuilder.public_instance_methods(false) - ['build']
        method_names.each do |method_name|
          define_method(method_name) do |*args, &block|
            @meta_builder.send(method_name, *args, &block) and self
          end
        end
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
meta-api-0.0.6 lib/meta/route_dsl/meta_builder.rb
meta-api-0.0.5 lib/meta/route_dsl/meta_builder.rb
meta-api-0.0.4 lib/meta/route_dsl/meta_builder.rb
meta-api-0.0.3 lib/meta/route_dsl/meta_builder.rb
meta-api-0.0.2 lib/meta/route_dsl/meta_builder.rb
meta-api-0.0.1 lib/meta/route_dsl/meta_builder.rb