Sha256: 9b8d5ad6cf5bc4daf581e4c2023396a99f711cf7f6aee9fcbadb50b803019ab5

Contents?: true

Size: 1.28 KB

Versions: 4

Compression:

Stored size: 1.28 KB

Contents

# frozen_string_literal: true

class Zilla::Versions::V20::PathTemplate
  include Memery

  attr_reader :template

  RE = /(\{\s*(.+?)\s*\})/

  def initialize(template)
    @template = template
    @parameters = []

    @parameters = template.scan(RE).map(&:reverse).to_h
  end

  memoize def parameters = @parameters.keys.map(&:to_sym)

  def render(*args, **params) = render_params(path_parameters(*args, **params))

  def path_parameters(*args, **params) # rubocop:disable Metrics/AbcSize
    params = params.slice(*parameters)

    raise ArgumentError, "path parameters must only be passed as args OR params" if args.any? && params.any?

    count = args.count + params.count
    raise ArgumentError, "#{@parameters.count} path parameters expected, given: #{count}" if count != @parameters.count

    return validate!(params.transform_keys(&:to_s)) if params.any?

    @parameters.each_key.with_index.with_object({}) do |(k, i), acc|
      acc[k] = args[i]
    end
  end

  private

  def validate!(params)
    params.each_key do |k|
      raise ArgumentError, "unknown path parameter: #{k.inspect}, known: #{parameters}" unless @parameters.key?(k.to_s)
    end
  end

  def render_params(params)
    params.reduce(@template) do |acc, (k, v)|
      acc.sub(@parameters[k.to_s], v.to_s)
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
zilla-0.1.5 lib/zilla/versions/v20/path_template.rb
zilla-0.1.4 lib/zilla/versions/v20/path_template.rb
zilla-0.1.3 lib/zilla/versions/v20/path_template.rb
zilla-0.1.2 lib/zilla/versions/v20/path_template.rb