Sha256: 2f1040bc075e69086671da4df80af3f5969a7027059a62e45f99773098bac3d1

Contents?: true

Size: 1.26 KB

Versions: 1

Compression:

Stored size: 1.26 KB

Contents

# frozen_string_literal: true

module Leftovers
  class ConfigLoader
    class ValueOrArraySchema < Schema
      class << self
        def [](value_schema)
          new(value_schema)
        end
      end

      attr_reader :value_schema

      def initialize(value_schema)
        @value_schema = value_schema

        super()
      end

      def validate(node)
        if node.array?
          validate_length(node) && validate_values(node)
        else
          validate_or_schema(node)
        end
      end

      def to_ruby(node)
        if node.array?
          Leftovers.unwrap_array(
            node.children.map do |value|
              value_schema.to_ruby(value)
            end
          )
        else
          value_schema.to_ruby(node)
        end
      end

      private

      def validate_or_schema(node)
        value_schema.validate(node)
        return true if node.valid?

        node.error += ' or an array'

        false
      end

      def validate_length(node)
        self.class.error(node, 'not be empty') if node.children.empty?

        node.valid?
      end

      def validate_values(node)
        node.children.each do |value|
          value_schema.validate(value)
        end

        node.children.all?(&:valid?)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
leftovers-0.8.0 lib/leftovers/config_loader/value_or_array_schema.rb