Sha256: 7ee6c2ac1f400df06bc0fa822fa06146ffb9c8e0a3e0376775041e583a539d65

Contents?: true

Size: 1.37 KB

Versions: 1

Compression:

Stored size: 1.37 KB

Contents

# Namespace to create custom fragments from client scripts
module Fragment
  include Ecoportal::API::Common::GraphQL::ClassHelpers
end
# Class to define/parse fragments
module Ecoportal
  module API
    class GraphQL
      class Fragment
        include Ecoportal::API::Common::GraphQL::ClassHelpers

        class << self
          def fragment(sym, heredoc)
            fragments[sym] = heredoc
          end

          def fragments
            @fragments ||= {}
          end
        end

        attr_reader :client, :fragments

        def initialize(client)
          @client = client
          parse
        end

        def define(sym, heredoc, namespace: ::Fragment)
          namespace.remove_const(sym) if namespace.const?(sym)
          client.parse(heredoc).tap do |fragment|
            namespace.const_set(sym, fragment)
            ::Fragment.const_set(sym, fragment) unless namespace == ::Fragment
          end
        end

        private

        def parse
          fragments = self.class.fragments.each_with_object({}) do |(sym, heredoc), out|
            out[sym] = define(sym, heredoc, namespace: self.class)
          end
        end
      end
    end
  end
end

require 'ecoportal/api/graphql/fragment/pagination'
require 'ecoportal/api/graphql/fragment/action'
require 'ecoportal/api/graphql/fragment/contractor_entity'

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
ecoportal-api-graphql-0.1.5 lib/ecoportal/api/graphql/fragment.rb