Class: Dry::Schema::Macros::Value Private
- Defined in:
- lib/dry/schema/macros/value.rb
Overview
This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.
A macro used for specifying predicates to be applied to values from a hash
Instance Attribute Summary
Attributes inherited from DSL
#chain, #predicate_inferrer, #primitive_inferrer
Instance Method Summary collapse
- #array_type?(type) ⇒ Boolean private
- #build_array_type(array_type, member) ⇒ Object private
- #call(*args, **opts, &block) ⇒ Object private
- #hash_type?(type) ⇒ Boolean private
- #import_steps(schema) ⇒ Object private
- #maybe_type?(type) ⇒ Boolean private
- #respond_to_missing?(meth, include_private = false) ⇒ Boolean private
Methods inherited from DSL
#array, #custom_type?, #each, #filled, #hash, #schema, #type, #value
Methods inherited from Core
#new, #operation, #path, #to_ast, #to_rule
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(meth, *args, &block) ⇒ Object (private)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
111 112 113 114 115 116 117 |
# File 'lib/dry/schema/macros/value.rb', line 111 def method_missing(meth, *args, &block) if meth.to_s.end_with?(QUESTION_MARK) trace.__send__(meth, *args, &block) else super end end |
Instance Method Details
#array_type?(type) ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
70 71 72 |
# File 'lib/dry/schema/macros/value.rb', line 70 def array_type?(type) primitive_inferrer[type].eql?([::Array]) end |
#build_array_type(array_type, member) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/dry/schema/macros/value.rb', line 85 def build_array_type(array_type, member) if array_type.respond_to?(:of) array_type.of(member) else raise ArgumentError, <<~ERROR.split("\n").join(" ") Cannot define schema for a nominal array type. Array types must be instances of Dry::Types::Array, usually constructed with Types::Constructor(Array) { ... } or Dry::Types['array'].constructor { ... } ERROR end end |
#call(*args, **opts, &block) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 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 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/dry/schema/macros/value.rb', line 14 def call(*args, **opts, &block) types, predicates = args.partition { |arg| arg.is_a?(Dry::Types::Type) } constructor = types.select { |type| type.is_a?(Dry::Types::Constructor) }.reduce(:>>) schema = predicates.detect { |predicate| predicate.is_a?(Processor) } schema_dsl.set_type(name, constructor) if constructor type_spec = opts[:type_spec] if schema current_type = schema_dsl.types[name] updated_type = if array_type?(current_type) build_array_type(current_type, schema.type_schema) else schema.type_schema end import_steps(schema) if !custom_type? || array_type?(current_type) || hash_type?(current_type) type(updated_type) elsif maybe_type?(current_type) type(updated_type.optional) end end trace_opts = opts.reject { |key, _| %i[type_spec type_rule].include?(key) } if (type_rule = opts[:type_rule]) trace.append(type_rule).evaluate(*predicates, **trace_opts) trace.append(new(chain: false).instance_exec(&block)) if block else trace.evaluate(*predicates, **trace_opts) if block && type_spec.equal?(:hash) hash(&block) elsif type_spec.is_a?(::Dry::Types::Type) && hash_type?(type_spec) hash(type_spec) elsif block trace.append(new(chain: false).instance_exec(&block)) end end if trace.captures.empty? raise ArgumentError, "wrong number of arguments (given 0, expected at least 1)" end each(type_spec.type.member) if type_spec.respond_to?(:member) self end |
#hash_type?(type) ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
75 76 77 |
# File 'lib/dry/schema/macros/value.rb', line 75 def hash_type?(type) primitive_inferrer[type].eql?([::Hash]) end |
#import_steps(schema) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
99 100 101 |
# File 'lib/dry/schema/macros/value.rb', line 99 def import_steps(schema) schema_dsl.steps.import_callbacks(Path[[*path, name]], schema.steps) end |
#maybe_type?(type) ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
80 81 82 |
# File 'lib/dry/schema/macros/value.rb', line 80 def maybe_type?(type) type.[:maybe].equal?(true) end |
#respond_to_missing?(meth, include_private = false) ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
104 105 106 |
# File 'lib/dry/schema/macros/value.rb', line 104 def respond_to_missing?(meth, include_private = false) super || meth.to_s.end_with?(QUESTION_MARK) end |