class ShafClient::Link

Public Class Methods

from(data) click to toggle source
# File lib/shaf_client/link.rb, line 5
def self.from(data)
  if data.is_a? Array
    data.map { |d| new(href: d['href'], templated: d['templated']) }
  else
    new(href: data['href'], templated: data['templated'])
  end
end
new(href:, templated: false) click to toggle source
# File lib/shaf_client/link.rb, line 13
def initialize(href:, templated: false)
  @href = href
  @templated = !!templated
end

Public Instance Methods

href() click to toggle source
# File lib/shaf_client/link.rb, line 22
def href
  @href.dup
end
resolve_templated(**args) click to toggle source
# File lib/shaf_client/link.rb, line 26
def resolve_templated(**args)
  return href unless templated?

  href
    .yield_self { |href| resolve_required(href, **args) }
    .yield_self { |href| resolve_optional(href, **args) }
end
templated?() click to toggle source
# File lib/shaf_client/link.rb, line 18
def templated?
  @templated
end
to_h() click to toggle source
# File lib/shaf_client/link.rb, line 34
def to_h
  {
    href: href,
    templated: templated?
  }
end

Private Instance Methods

resolve_optional(href, **args) click to toggle source
# File lib/shaf_client/link.rb, line 52
def resolve_optional(href, **args)
  String(href).gsub(/{\?([^}]*)}/) do
    values = []
    $1.split(',').each do |key|
      next unless args.key? key.to_sym
      values << "#{key}=#{args[key.to_sym]}"
    end

    next '' if values.empty?
    "?#{values.join('&')}"
  end
end
resolve_required(href, **args) click to toggle source
# File lib/shaf_client/link.rb, line 43
def resolve_required(href, **args)
  String(href).gsub(/{(?!\?)([^}]*)}/) do
    key = $1.to_sym
    args.fetch key do
      raise ArgumentError, "missing keyword: :#{key}"
    end
  end
end