Sha256: 55e3995fb1111f84dc85da27569ccf1f789eb6682214f3fde33021191cdb8386

Contents?: true

Size: 1.83 KB

Versions: 1

Compression:

Stored size: 1.83 KB

Contents

# frozen_string_literal: true

module GraphqlConnector
  class BaseServerTypeAlreadyExistsError < StandardError; end
  # Class to wrap http_client calls under a specific namespaced class
  class BaseServerType
    class << self
      def build(name, uri, headers = {}, connector = {})
        verify_new_client_type_for!(name)
        base_class = class_with(uri, headers, connector)
        base_object = GraphqlConnector.const_set(name, base_class)
        inject_http_client_delegations(base_object)
        create_service_class_module(base_object)

        base_object
      end

      private

      def verify_new_client_type_for!(name)
        return unless GraphqlConnector.const_defined?(name)

        raise BaseServerTypeAlreadyExistsError,
              "The name: #{name} is already in use. Check your "\
              'configuration!'
      end

      def create_service_class_module(base_object)
        base_object.class_eval <<-METHOD, __FILE__, __LINE__ + 1
          module Query
            def self.extended(base)
              base.extend(GraphqlConnector::ServiceClassable::Queryable)
            end

            def http_client
              #{base_object}.http_client
            end
          end
        METHOD
      end

      def class_with(uri, headers = {}, connector = {})
        Class.new do
          attr_accessor :uri, :headers, :connector
          @uri       = uri
          @headers   = headers
          @connector = connector
        end
      end

      def inject_http_client_delegations(base_object)
        base_object.instance_eval do
          extend SingleForwardable
          def_delegators :http_client, :query, :raw_query, :mutation

          def http_client
            @http_client ||=
              GraphqlConnector::HttpClient.new(@uri, @headers, @connector)
          end
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
graphql_connector-1.3.1 lib/graphql_connector/base_server_type.rb