Module: ElasticGraph::Support::GraphQLFormatter
- Defined in:
- lib/elastic_graph/support/graphql_formatter.rb
Overview
Utility module that provides helper methods for generating well-formatted GraphQL syntax.
Class Method Summary collapse
-
.format_args(**args) ⇒ Object
Formats the given hash as an argument list.
-
.serialize(value, wrap_hash_with_braces: true) ⇒ Object
Formats the given value in GraphQL syntax.
Class Method Details
.format_args(**args) ⇒ Object
Formats the given hash as an argument list. If ‘args` is empty, returns an empty string. Otherwise, wraps the args list in parens. This allows the returned string to be appended to a field or directive, and it’ll correctly use parens (or not) based on if there are args or not.
19 20 21 22 |
# File 'lib/elastic_graph/support/graphql_formatter.rb', line 19 def self.format_args(**args) return "" if args.empty? "(#{serialize(args, wrap_hash_with_braces: false)})" end |
.serialize(value, wrap_hash_with_braces: true) ⇒ Object
Formats the given value in GraphQL syntax. This method was derived from a similar method from the graphql-ruby gem:
github.com/rmosolgo/graphql-ruby/blob/v1.11.4/lib/graphql/language.rb#L17-L33
We don’t want to use that method because it is marked as ‘@api private`, indicating it could be removed in any release of the graphql gem. If we used it, it could hinder future upgrades.
Our implementation here differs in a few ways:
-
case statement instead of multiple ‘if value.is_a?` checks (a bit cleaner)
-
‘wrap_hash_with_braces` since we do not want to wrap an args hash with braces.
-
Readable spacing has been added so we get ‘foo: [1, 2], bar: 3` instead of `foo:,bar:3`.
-
Symbol support has been added. Symbols are converted to strings (with no quotes), allowing callers to pass them for GraphQL enums.
-
We’ve removed the ‘quirks_mode: true` flag passed to `JSON.generate` since it has been deprecated for a while: github.com/flori/json/issues/309
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/elastic_graph/support/graphql_formatter.rb', line 42 def self.serialize(value, wrap_hash_with_braces: true) case value when ::Hash serialized_hash = value.map do |k, v| "#{k}: #{serialize v}" end.join(", ") return serialized_hash unless wrap_hash_with_braces "{#{serialized_hash}}" when ::Array serialized_array = value.map do |v| serialize v end.join(", ") "[#{serialized_array}]" when ::Symbol value.to_s else ::JSON.generate(value) end end |