Class: MaxBotApi::Updates::Parser

Inherits:
Object
  • Object
show all
Defined in:
lib/max_bot_api/updates/parser.rb

Overview

Update parsing helpers.

Class Method Summary collapse

Class Method Details

.deep_symbolize_keys(value) ⇒ Object

Deep symbolize hash keys.



46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/max_bot_api/updates/parser.rb', line 46

def self.deep_symbolize_keys(value)
  case value
  when Hash
    value.each_with_object({}) do |(k, v), acc|
      acc[k.to_sym] = deep_symbolize_keys(v)
    end
  when Array
    value.map { |item| deep_symbolize_keys(item) }
  else
    value
  end
end

.normalize_attachments!(update) ⇒ Object

Normalize attachment payloads to symbolized hashes.



32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/max_bot_api/updates/parser.rb', line 32

def self.normalize_attachments!(update)
  message = update.dig(:message)
  body = message && message[:body]
  if body && body[:attachments].is_a?(Array)
    body[:attachments] = body[:attachments].map { |att| deep_symbolize_keys(att) }
  end

  linked_body = update.dig(:message, :link, :message, :attachments)
  return unless linked_body.is_a?(Array)

  update[:message][:link][:message][:attachments] = linked_body.map { |att| deep_symbolize_keys(att) }
end

.parse_update(data, debug: false) ⇒ Hash

Parse a single update JSON string or hash.

Parameters:

  • data (String, Hash)
  • debug (Boolean) (defaults to: false)

Returns:

  • (Hash)


11
12
13
14
15
16
17
18
# File 'lib/max_bot_api/updates/parser.rb', line 11

def self.parse_update(data, debug: false)
  raw = data.is_a?(String) ? data : JSON.generate(data)
  update = data.is_a?(Hash) ? deep_symbolize_keys(data) : JSON.parse(raw, symbolize_names: true)

  update[:debug_raw] = raw if debug
  normalize_attachments!(update)
  update
end

.parse_update_list(data, debug: false) ⇒ Hash

Parse a list of updates.

Parameters:

  • data (String, Hash)
  • debug (Boolean) (defaults to: false)

Returns:

  • (Hash)


24
25
26
27
28
29
# File 'lib/max_bot_api/updates/parser.rb', line 24

def self.parse_update_list(data, debug: false)
  list = data.is_a?(Hash) ? data : JSON.parse(data.to_s, symbolize_names: true)
  updates = Array(list[:updates])
  list[:updates] = updates.map { |u| parse_update(u, debug: debug) }
  list
end