spacetraders.rb/lib/endpoint.rb

63 lines
1.9 KiB
Ruby

# frozen_string_literal: true
require 'active_support/all'
class SpaceTraders::Endpoint
attr_reader :client
def initialize(client:)
@client = client
end
delegate :get, to: :client
delegate :post, to: :client
def self.fills_endpoint_placeholders(raw_endpoint, params, query: false)
Log.debug("raw_endpoint #{raw_endpoint}")
mutated = params.reduce(raw_endpoint) do |base, kv|
Log.debug("endpoint mutate #{base}")
if base.match?(/:#{kv[0]}\b/)
base.gsub(/:#{kv[0]}\b/, kv[1])
elsif query
join = base.include?("?") ? "&" : "?"
"#{base}#{join}#{kv[0]}=#{kv[1]}"
else
base
end
end
Log.debug("endpoint mutate to #{mutated}")
mutated
end
def self.define_endpoint(method_name, get: nil, post: nil)
SpaceTraders::Log.debug("define endpoint #{method_name} to #{get || post}")
if get
define_method(method_name) do |params={}, &block|
endpoint = SpaceTraders::Endpoint.fills_endpoint_placeholders(get || post, params, query: true)
SpaceTraders::Log.debug("filled_endpoint of #{method_name} to #{endpoint} with #{get || post} and #{params}")
if block
get(endpoint: endpoint, &block)
else
get(endpoint: endpoint)
# method get from client(endpoint url get from params)
end
end
elsif post
define_method(method_name) do |params={}, body=nil, &block|
endpoint = SpaceTraders::Endpoint.fills_endpoint_placeholders(get || post, params, query: false)
SpaceTraders::Log.debug("filled_endpoint of #{method_name} to #{endpoint} with #{get || post} and #{params}")
if block
post(endpoint: endpoint, body: body, &block)
else
post(endpoint: endpoint, body: body)
end
end
end
end
end
Dir['lib/endpoint/*.rb'].each do
SpaceTraders::Log.warn("load #{_1}")
load _1
end