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 |