Sha256: a7ccf76c92dcb094490e27f169fd4c74fbbc6d90a0732dde4b13d411d5e71e53

Contents?: true

Size: 1.08 KB

Versions: 3

Compression:

Stored size: 1.08 KB

Contents

module Schemacop
  class FieldNode < NodeSupportingType
    attr_reader :name

    def initialize(name, required, options = {}, &block)
      if options.any?
        fail Exceptions::InvalidSchemaError, 'Node does not support options.'
      end

      super({}, &block)

      @name = name
      @required = required
    end

    def validate(data, collector)
      unless data.key?(name)
        collector.error "Missing key #{name.inspect}." if @required
      end

      collector.path "/#{name}", name, :hash do
        value, default_applied = apply_default!(data[name], collector)

        unless data.key?(name) || default_applied
          next
        end

        super(value, collector)
      end
    end

    private

    def apply_default!(data, collector)
      return data, false unless data.nil?

      @types.each do |type|
        next unless type.option?(:default)
        default = type.option(:default)
        default = default.call if default.is_a?(Proc)
        collector.override_value(default)
        return default, true
      end

      return nil, false
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
schemacop-2.4.7 lib/schemacop/field_node.rb
schemacop-2.4.6 lib/schemacop/field_node.rb
schemacop-2.4.5 lib/schemacop/field_node.rb