Sha256: e993b214066fff763da208e9db20acc3dddf02e464cdea680abe3ad19de0167d

Contents?: true

Size: 1.35 KB

Versions: 2

Compression:

Stored size: 1.35 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]&.to_s || node.to_ruby
        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

2 entries across 2 versions & 1 rubygems

Version Path
leftovers-0.8.0 lib/leftovers/config_loader/string_enum_schema.rb
leftovers-0.7.0 lib/leftovers/config_loader/string_enum_schema.rb