45 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
module Gitlab
 | 
						|
  module Graphql
 | 
						|
    class Variables
 | 
						|
      Invalid = Class.new(Gitlab::Graphql::StandardGraphqlError)
 | 
						|
 | 
						|
      def initialize(param)
 | 
						|
        @param = param
 | 
						|
      end
 | 
						|
 | 
						|
      def to_h
 | 
						|
        ensure_hash(@param)
 | 
						|
      end
 | 
						|
 | 
						|
      private
 | 
						|
 | 
						|
      # Handle form data, JSON body, or a blank value
 | 
						|
      def ensure_hash(ambiguous_param)
 | 
						|
        case ambiguous_param
 | 
						|
        when String
 | 
						|
          if ambiguous_param.present?
 | 
						|
            ensure_hash(Gitlab::Json.parse(ambiguous_param))
 | 
						|
          else
 | 
						|
            {}
 | 
						|
          end
 | 
						|
        when Hash
 | 
						|
          ambiguous_param
 | 
						|
        when ActionController::Parameters
 | 
						|
          # We can and have to trust the "Parameters" because `graphql-ruby` handles this hash safely
 | 
						|
          # Also, `graphql-ruby` uses hash-specific methods, for example `size`:
 | 
						|
          # https://sourcegraph.com/github.com/rmosolgo/graphql-ruby@61232b03412df6685406fc46c414e11d3f447817/-/blob/lib/graphql/query.rb?L304
 | 
						|
          ambiguous_param.to_unsafe_h
 | 
						|
        when nil
 | 
						|
          {}
 | 
						|
        else
 | 
						|
          raise Invalid, "Unexpected parameter: #{ambiguous_param}"
 | 
						|
        end
 | 
						|
      rescue JSON::ParserError => e
 | 
						|
        raise Invalid, e
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |