class GraphQL::StaticValidation::ComplexityValidator include GraphQL::StaticValidation::Message::MessageHelper def initialize(max_fields:, list_multiplier:) @max_fields = max_fields @list_multiplier = list_multiplier end def validate(context) visitor = context.visitor complexity = 0 visitor[GraphQL::Language::Nodes::Field] << -> (node, parent) { field_type = field_definition.type if field_type.kind.list? complexity += list_multiplier else complexity += 1 end } visitor[GraphQL::Language::Nodes::Document].exit << -> (node, parent) { if complexity > @max_fields context.errors << message("This query is too complex. Request fewer fields.", node) end } end end