Sha256: 1a23cb4fd09be332e62bbd43d7e80b7c4e14322d3d59672ac51214e72955d9a0

Contents?: true

Size: 1.55 KB

Versions: 3

Compression:

Stored size: 1.55 KB

Contents

# frozen_string_literal: true

require 'dry/equalizer'

require 'dry/schema/constants'

module Dry
  module Schema
    module Messages
      # Template wraps a string with interpolation tokens and defines evaluator function
      # dynamically
      #
      # @api private
      class Template
        include Dry::Equalizer(:text)

        TOKEN_REGEXP = /%{([\w\d]*)}/

        # !@attribute [r] text
        # @return [String]
        attr_reader :text

        # !@attribute [r] tokens
        # @return [Hash]
        attr_reader :tokens

        # !@attribute [r] evaluator
        # @return [Proc]
        attr_reader :evaluator

        # @api private
        def self.[](input)
          new(*parse(input))
        end

        # @api private
        def self.parse(input)
          tokens = input.scan(TOKEN_REGEXP).flatten(1).map(&:to_sym)
          text = input.gsub('%', '#')

          evaluator = <<-RUBY.strip
            -> (#{tokens.map { |token| "#{token}:" }.join(", ")}) { "#{text}" }
          RUBY

          [text, tokens, eval(evaluator, binding, __FILE__, __LINE__ - 3)]
        end

        # @api private
        def initialize(text, tokens, evaluator)
          @text = text
          @tokens = tokens
          @evaluator = evaluator
        end

        # @api private
        def data(input)
          tokens.each_with_object({}) { |k, h| h[k] = input[k] }
        end

        # @api private
        def call(data = EMPTY_HASH)
          data.empty? ? evaluator.() : evaluator.(data)
        end
        alias_method :[], :call
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
dry-schema-1.0.2 lib/dry/schema/messages/template.rb
dry-schema-1.0.1 lib/dry/schema/messages/template.rb
dry-schema-1.0.0 lib/dry/schema/messages/template.rb