Sha256: 4ccbdf5bb9a7119e7dd567f10cab35a2406c407269a4a3aeb379effa631d1dd6

Contents?: true

Size: 1.34 KB

Versions: 4

Compression:

Stored size: 1.34 KB

Contents

# frozen_string_literal: true

module Leftovers
  class ConfigLoader
    class StringEnumSchema < Schema
      class << self
        def value(value, aliases: nil)
          values << value
          Leftovers.each_or_self(aliases) do |alias_name|
            self.aliases[alias_name] = value
          end
        end

        def aliases
          @aliases ||= {}
        end

        def aliases_for(value)
          aliases.select { |_k, v| v == value }.keys
        end

        def values
          @values ||= []
        end

        def each_value(&block)
          @values.each(&block)
        end

        def to_ruby(node)
          aliases[node.to_sym] || node.to_sym
        end

        def validate(node)
          if node.string?
            node.error = error_message_with_suggestions(node) unless valid_value?(node.to_sym)
          else
            error(node, 'be a string')
          end

          super
        end

        private

        def valid_value?(val)
          values.include?(val) || aliases.key?(val)
        end

        def suggester
          @suggester ||= Suggester.new(values)
        end

        def error_message_with_suggestions(node)
          suggestions = suggester.suggest(node.to_ruby)

          "unrecognized value #{node} for #{node.name}\nDid you mean: #{suggestions.join(', ')}"
        end
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
leftovers-0.11.1 lib/leftovers/config_loader/string_enum_schema.rb
leftovers-0.11.0 lib/leftovers/config_loader/string_enum_schema.rb
leftovers-0.10.0 lib/leftovers/config_loader/string_enum_schema.rb
leftovers-0.9.0 lib/leftovers/config_loader/string_enum_schema.rb