Sha256: 0276e76bcfd080b29cb1f62cf98cda7e8bd81ea07e3e54a9d16a3b4a82f295e9

Contents?: true

Size: 1.11 KB

Versions: 2

Compression:

Stored size: 1.11 KB

Contents

# frozen_string_literal: true

require "dry/monads"

module Etcher
  module Transformers
    # Formats given key using existing and/or placeholder attributes.
    class Format
      include Dry::Monads[:result]

      def initialize key, *retainers, **mappings
        @key = key
        @retainers = retainers
        @mappings = mappings
        @pattern = /%<.+>s/o
        freeze
      end

      def call attributes
        value = attributes[key]

        return Success attributes unless value && value.match?(pattern)

        Success attributes.merge!(key => format(value, **attributes, **pass_throughs))
      rescue KeyError => error
        Failure step: :transform,
                constant: self.class,
                payload: "Unable to transform #{key.inspect}, missing specifier: " \
                         "\"#{error.message[/<.+>/]}\"."
      end

      private

      attr_reader :key, :retainers, :mappings, :pattern

      def pass_throughs
        retainers.each
                 .with_object({}) { |key, expansions| expansions[key] = "%<#{key}>s" }
                 .merge! mappings
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
etcher-3.1.0 lib/etcher/transformers/format.rb
etcher-3.0.0 lib/etcher/transformers/format.rb