Sha256: 0fc2a70ad4f9097cb7779a529a3b32c9f8198a72eb19e074e3c118f8b1b92caf

Contents?: true

Size: 1.17 KB

Versions: 1

Compression:

Stored size: 1.17 KB

Contents

class RubyStringTemplate < String
	class NoValueForTemplatePlaceholderError < ArgumentError
		def initialize(name, template)
			super "no value for '\#{#{name}}' in template '#{template}'"
		end
	end

	def initialize(template, &resolver)
		super(template.to_s)
		@resolvers = []
		@resolvers << resolver if resolver
		@resolvers << ->(locals, name){locals[name]}
	end

	def initialize_copy(source)
		super
		# copy resolvers array
		resolvers =
		source.instance_eval do
			resolvers = @resolvers
		end
		@resolvers = resolvers.dup
	end

	def render(locals = {})
		self.gsub(/#\{[^\}]+\}/um) do |placeholder|
			name = placeholder.match(/#\{([^\}]*)\}/u).captures.first.to_sym

			@resolvers.find do |resolver|
				value = resolver.call(locals, name)
				value and break value.to_s
			end or fail NoValueForTemplatePlaceholderError.new(name, self)
		end.to_s
	end

	def to_template
		self
	end

	def add_missing_resolver(&resolver)
		@resolvers << resolver
	end

	def with_missing_resolver(&resolver)
		new_template = self.dup
		new_template.add_missing_resolver(&resolver)
		new_template
	end

	def inspect
		"T<#{to_s}>"
	end
end

class String
	def to_template
		RubyStringTemplate.new(self)
	end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
httpimagestore-1.9.0 lib/httpimagestore/ruby_string_template.rb