module GromNative

Top level namespace for our gem

Constants

VERSION

Public Class Methods

build_nodes(data_struct, filter, decorators) click to toggle source
# File lib/grom_native.rb, line 38
def self.build_nodes(data_struct, filter, decorators)
  nodes = []
  nodes_by_subject = {}
  filtered_nodes = Array.new(filter.size) { [] }

  data_struct.fetch('statementsBySubject', []).each do |subject, statements|
    node = GromNative::Node.new(statements, decorators)

    nodes << node
    nodes_by_subject[subject] = node

    if !filter.empty? && node.respond_to?(:type)
      node_types = node.blank? ? Array(::Grom::Node::BLANK) : Array(node.type)
      indexes = node_types.reduce([]) do |memo, type|
        index = filter.index(type)
        memo << index if index

        memo
      end

      indexes.each { |index| filtered_nodes[index] << node }
    end
  end

  link_nodes(nodes_by_subject, data_struct)

  return filtered_nodes.first if filter && filter.size == 1
  return filtered_nodes       if filter

  nodes
end
fetch(uri:, headers: {}, filter: [], decorators: nil) click to toggle source
# File lib/grom_native.rb, line 13
def self.fetch(uri:, headers: {}, filter: [], decorators: nil)
  input = { uri: uri, headers: headers, filter: filter }
  data_struct = JSON.parse(get(uri))

  handle_errors(data_struct)

  build_nodes(data_struct, filter, decorators)
end
handle_errors(data_struct) click to toggle source
# File lib/grom_native.rb, line 22
def self.handle_errors(data_struct)
  error = nil
  status_code = data_struct.fetch('status_code', 0)

  if status_code >= 500
    error = "Server error: #{data_struct['error']}"
  elsif status_code >= 300 && status_code < 500
    error = "Client error: #{data_struct['error']}"
  end

  # require 'irb'; binding.irb
  error ||= data_struct['error']

  raise StandardError, error if error != "" && error != nil
end