Class: Honeymaker::Exchange

Inherits:
Object
  • Object
show all
Defined in:
lib/honeymaker/exchange.rb

Constant Summary collapse

OPTIONS =
{
  request: {
    open_timeout: 5,
    read_timeout: 30,
    write_timeout: 5
  }
}.freeze
ERROR_PATTERNS =
[].freeze

Instance Method Summary collapse

Instance Method Details

#cache_ttlObject



68
69
70
# File 'lib/honeymaker/exchange.rb', line 68

def cache_ttl
  3600
end

#classify_error(message) ⇒ Object



15
16
17
18
19
20
21
22
23
# File 'lib/honeymaker/exchange.rb', line 15

def classify_error(message)
  return nil if message.nil?

  self.class::ERROR_PATTERNS.each do |entry|
    next unless (match = entry[:pattern].match(message))
    return { code: entry[:code], **match.named_captures.transform_keys(&:to_sym) }
  end
  nil
end

#find_ticker(symbol) ⇒ Object



53
54
55
56
57
58
59
# File 'lib/honeymaker/exchange.rb', line 53

def find_ticker(symbol)
  result = tickers_info
  return result if result.failure?

  ticker = result.data.find { |t| t[:ticker] == symbol }
  ticker ? Result::Success.new(ticker) : Result::Failure.new("Unknown symbol: #{symbol}")
end

#get_bid_ask(symbol) ⇒ Object

Raises:

  • (NotImplementedError)


29
30
31
# File 'lib/honeymaker/exchange.rb', line 29

def get_bid_ask(symbol)
  raise NotImplementedError, "#{self.class} must implement #get_bid_ask"
end

#get_price(symbol) ⇒ Object



33
34
35
36
37
38
# File 'lib/honeymaker/exchange.rb', line 33

def get_price(symbol)
  result = get_bid_ask(symbol)
  return result if result.failure?

  Result::Success.new((result.data[:bid] + result.data[:ask]) / 2)
end

#get_tickers_infoObject

Raises:

  • (NotImplementedError)


25
26
27
# File 'lib/honeymaker/exchange.rb', line 25

def get_tickers_info
  raise NotImplementedError, "#{self.class} must implement #get_tickers_info"
end

#symbolsObject



61
62
63
64
65
66
# File 'lib/honeymaker/exchange.rb', line 61

def symbols
  result = tickers_info
  return result if result.failure?

  Result::Success.new(result.data.map { |t| { base: t[:base], quote: t[:quote] } })
end

#tickers_infoObject



40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/honeymaker/exchange.rb', line 40

def tickers_info
  if @tickers_info_cache && @tickers_info_expires_at && @tickers_info_expires_at > Time.now
    return Result::Success.new(@tickers_info_cache)
  end

  result = get_tickers_info
  if result.success?
    @tickers_info_cache = result.data
    @tickers_info_expires_at = Time.now + cache_ttl
  end
  result
end