Class: Meta::Utils::KeywordArgs

Inherits:
Object
  • Object
show all
Defined in:
lib/meta/utils/kwargs/check.rb,
lib/meta/utils/kwargs/builder.rb,
lib/meta/utils/kwargs/checker.rb

Defined Under Namespace

Modules: Checker Classes: Argument, Builder

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(arguments, permit_extras = false, final_consumer = nil) ⇒ KeywordArgs

Returns a new instance of KeywordArgs.



25
26
27
28
29
# File 'lib/meta/utils/kwargs/builder.rb', line 25

def initialize(arguments, permit_extras = false, final_consumer = nil)
  @arguments = arguments
  @permit_extras = permit_extras
  @final_consumer = final_consumer
end

Class Method Details

.check(args:, schema:) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/meta/utils/kwargs/check.rb', line 32

def check(args:, schema:)
  schemas = build_schemas(schema)

  # 不接受额外的关键字参数
  extras = args.keys - schemas.keys
  raise "不接受额外的关键字参数:#{extras.join(', ')}" unless extras.empty?

  # 通过 schema 导出关键字参数
  missing = []
  result = schemas.map do |name, spec|
    if args.include?(name)
      [name, args[name]]
    elsif spec.include?(:default)
      [name, spec[:default]]
    else
      missing << name
    end
  end.to_h

  # 检查以上导出过程中是否找到缺失的参数
  if missing.empty?
    result
  else
    raise "缺失必要的关键字参数:#{missing.join(', ')}"
  end
end

Instance Method Details

#check(args) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/meta/utils/kwargs/builder.rb', line 31

def check(args)
  args = args.dup
  final_args = {}

  @arguments.each do |argument|
    argument.consume(final_args, args)
  end

  # 做最终的修饰
  @final_consumer.call(final_args, args) if @final_consumer

  # 处理剩余字段
  unless args.keys.empty?
    if @permit_extras
      final_args.merge!(args)
    else
      extras = args.keys
      raise "不接受额外的关键字参数:#{extras.join(', ')}" unless extras.empty?
    end
  end

  final_args
end