Sha256: 203b45763996e991355eba3d4a3ce00d69c2ef41b155c50b90462f38344ef450

Contents?: true

Size: 1.3 KB

Versions: 162

Compression:

Stored size: 1.3 KB

Contents

# frozen_string_literal: true

module EacRubyUtils
  # A formatter like [String.sprintf].
  class CustomFormat
    TYPE_PATTERN = /[a-zA-Z]/.freeze
    SEQUENCE_PATTERN = /(?<!%)%(#{TYPE_PATTERN})/.freeze

    attr_reader :mapping

    def initialize(mapping)
      @mapping = mapping.transform_keys(&:to_sym).freeze
    end

    def format(string)
      ::EacRubyUtils::CustomFormat::String.new(self, string)
    end

    class String
      attr_reader :format, :string

      def initialize(format, string)
        @format = format
        @string = string
      end

      def mapping
        @mapping ||= format.mapping.select do |k, _v|
          sequences.include?(k)
        end
      end

      def sequences
        @sequences ||= string.scan(SEQUENCE_PATTERN).map(&:first).uniq.map(&:to_sym)
      end

      def source_object_value(object, method)
        return object.send(method) if object.respond_to?(method)
        return object[method] if object.respond_to?('[]')

        raise ::ArgumentError, "Methods \"#{method}\" or \"[]\" not found for #{object}"
      end

      def with(source_object)
        r = string
        mapping.each do |key, method|
          r = r.gsub(/%#{::Regexp.quote(key)}/, source_object_value(source_object, method).to_s)
        end
        r.gsub('%%', '%')
      end
    end
  end
end

Version data entries

162 entries across 162 versions & 3 rubygems

Version Path
eac_ruby_utils-0.124.0 lib/eac_ruby_utils/custom_format.rb
eac_tools-0.97.2 sub/eac_ruby_utils/lib/eac_ruby_utils/custom_format.rb
eac_ruby_utils-0.123.0 lib/eac_ruby_utils/custom_format.rb
eac_ruby_utils-0.121.0 lib/eac_ruby_utils/custom_format.rb
eac_ruby_utils-0.120.0 lib/eac_ruby_utils/custom_format.rb
eac_tools-0.76.1 sub/eac_ruby_utils/lib/eac_ruby_utils/custom_format.rb
eac_tools-0.76.0 sub/eac_ruby_utils/lib/eac_ruby_utils/custom_format.rb
eac_tools-0.75.2 sub/eac_ruby_utils/lib/eac_ruby_utils/custom_format.rb
eac_ruby_utils-0.119.2 lib/eac_ruby_utils/custom_format.rb
eac_tools-0.75.1 sub/eac_ruby_utils/lib/eac_ruby_utils/custom_format.rb
eac_tools-0.75.0 sub/eac_ruby_utils/lib/eac_ruby_utils/custom_format.rb
eac_ruby_utils-0.119.1 lib/eac_ruby_utils/custom_format.rb
eac_tools-0.74.1 sub/eac_ruby_utils/lib/eac_ruby_utils/custom_format.rb
eac_tools-0.74.0 sub/eac_ruby_utils/lib/eac_ruby_utils/custom_format.rb
eac_tools-0.73.0 sub/eac_ruby_utils/lib/eac_ruby_utils/custom_format.rb
eac_ruby_utils-0.119.0 lib/eac_ruby_utils/custom_format.rb
eac_tools-0.72.0 sub/eac_ruby_utils/lib/eac_ruby_utils/custom_format.rb
eac_ruby_utils-0.118.1 lib/eac_ruby_utils/custom_format.rb
eac_ruby_utils-0.118.0 lib/eac_ruby_utils/custom_format.rb
eac_tools-0.70.1 sub/eac_ruby_utils/lib/eac_ruby_utils/custom_format.rb