Skip to content

Commit ec9cce9

Browse files
authored
v5: New method to get variables values (graphql-dotnet#3426)
New method to get variables values
1 parent 29d4294 commit ec9cce9

File tree

10 files changed

+54
-13
lines changed

10 files changed

+54
-13
lines changed

.github/workflows/build-artifacts-code.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ on:
77
branches:
88
- master
99
- develop
10+
- v5
1011
paths:
1112
- src/**
1213
- .github/workflows/**

.github/workflows/codeql-analysis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ jobs:
1919
- name: Setup .NET Core SDK
2020
uses: actions/setup-dotnet@v2
2121
with:
22-
dotnet-version: '6.0.102'
22+
dotnet-version: '6.0.x'
2323

2424
- name: Initialize CodeQL
2525
uses: github/codeql-action/init@v2

.github/workflows/test-code.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ jobs:
3939
dotnet-version: |
4040
3.1.x
4141
5.0.x
42-
6.0.303
42+
6.0.x
4343
source-url: https://nuget.pkg.github.com/graphql-dotnet/index.json
4444
env:
4545
NUGET_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}

.github/workflows/test-documentation.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ on:
55
branches:
66
- master
77
- develop
8+
- v5
89
paths:
910
- docs2/**
1011
- package.json

src/Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project>
22

33
<PropertyGroup>
4-
<VersionPrefix>5.0.0-preview</VersionPrefix>
4+
<VersionPrefix>5.4.0-preview</VersionPrefix>
55
<NextVersion>6.0.0</NextVersion>
66
<LangVersion>latest</LangVersion>
77
<PackageLicenseExpression>MIT</PackageLicenseExpression>

src/GraphQL.ApiTests/net6/GraphQL.approved.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1151,7 +1151,6 @@ namespace GraphQL.Execution
11511151
public class ExecutionStrategyRegistration : System.IEquatable<GraphQL.Execution.ExecutionStrategyRegistration>
11521152
{
11531153
public ExecutionStrategyRegistration(GraphQL.Execution.IExecutionStrategy Strategy, GraphQLParser.AST.OperationType Operation) { }
1154-
protected virtual System.Type EqualityContract { get; }
11551154
public GraphQLParser.AST.OperationType Operation { get; set; }
11561155
public GraphQL.Execution.IExecutionStrategy Strategy { get; set; }
11571156
}
@@ -2915,9 +2914,15 @@ namespace GraphQL.Validation
29152914
public System.Collections.Generic.List<GraphQL.Validation.VariableUsage>? GetRecursiveVariables(GraphQLParser.AST.GraphQLOperationDefinition operation) { }
29162915
public System.Collections.Generic.List<GraphQLParser.AST.GraphQLFragmentDefinition>? GetRecursivelyReferencedFragments(GraphQLParser.AST.GraphQLOperationDefinition operation) { }
29172916
public System.Collections.Generic.List<GraphQLParser.AST.GraphQLFragmentDefinition>? GetRecursivelyReferencedFragments(System.Collections.Generic.List<GraphQLParser.AST.GraphQLOperationDefinition> operations) { }
2917+
[System.Obsolete("This method can repeatedly add the same error into ValidationContext.Errors colle" +
2918+
"ction when called multiple times. Use GetVariablesValues method instead.")]
29182919
public GraphQL.Validation.Variables GetVariableValues(GraphQL.Validation.IVariableVisitor? visitor = null) { }
29192920
public System.Collections.Generic.List<GraphQL.Validation.VariableUsage>? GetVariables<TNode>(TNode node)
29202921
where TNode : GraphQLParser.AST.ASTNode, GraphQLParser.AST.IHasSelectionSetNode { }
2922+
[return: System.Runtime.CompilerServices.TupleElementNames(new string?[]?[] {
2923+
"Variables",
2924+
"Errors"})]
2925+
public System.ValueTuple<GraphQL.Validation.Variables, System.Collections.Generic.List<GraphQL.Validation.ValidationError>?> GetVariablesValues(GraphQL.Validation.IVariableVisitor? visitor = null) { }
29212926
public string? IsValidLiteralValue(GraphQL.Types.IGraphType type, GraphQLParser.AST.GraphQLValue valueAst) { }
29222927
public void ReportError(GraphQL.Validation.ValidationError error) { }
29232928
}

src/GraphQL.ApiTests/netstandard20+netstandard21/GraphQL.approved.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1151,7 +1151,6 @@ namespace GraphQL.Execution
11511151
public class ExecutionStrategyRegistration : System.IEquatable<GraphQL.Execution.ExecutionStrategyRegistration>
11521152
{
11531153
public ExecutionStrategyRegistration(GraphQL.Execution.IExecutionStrategy Strategy, GraphQLParser.AST.OperationType Operation) { }
1154-
protected virtual System.Type EqualityContract { get; }
11551154
public GraphQLParser.AST.OperationType Operation { get; set; }
11561155
public GraphQL.Execution.IExecutionStrategy Strategy { get; set; }
11571156
}
@@ -2901,9 +2900,15 @@ namespace GraphQL.Validation
29012900
public System.Collections.Generic.List<GraphQL.Validation.VariableUsage>? GetRecursiveVariables(GraphQLParser.AST.GraphQLOperationDefinition operation) { }
29022901
public System.Collections.Generic.List<GraphQLParser.AST.GraphQLFragmentDefinition>? GetRecursivelyReferencedFragments(GraphQLParser.AST.GraphQLOperationDefinition operation) { }
29032902
public System.Collections.Generic.List<GraphQLParser.AST.GraphQLFragmentDefinition>? GetRecursivelyReferencedFragments(System.Collections.Generic.List<GraphQLParser.AST.GraphQLOperationDefinition> operations) { }
2903+
[System.Obsolete("This method can repeatedly add the same error into ValidationContext.Errors colle" +
2904+
"ction when called multiple times. Use GetVariablesValues method instead.")]
29042905
public GraphQL.Validation.Variables GetVariableValues(GraphQL.Validation.IVariableVisitor? visitor = null) { }
29052906
public System.Collections.Generic.List<GraphQL.Validation.VariableUsage>? GetVariables<TNode>(TNode node)
29062907
where TNode : GraphQLParser.AST.ASTNode, GraphQLParser.AST.IHasSelectionSetNode { }
2908+
[return: System.Runtime.CompilerServices.TupleElementNames(new string?[]?[] {
2909+
"Variables",
2910+
"Errors"})]
2911+
public System.ValueTuple<GraphQL.Validation.Variables, System.Collections.Generic.List<GraphQL.Validation.ValidationError>?> GetVariablesValues(GraphQL.Validation.IVariableVisitor? visitor = null) { }
29072912
public string? IsValidLiteralValue(GraphQL.Types.IGraphType type, GraphQLParser.AST.GraphQLValue valueAst) { }
29082913
public void ReportError(GraphQL.Validation.ValidationError error) { }
29092914
}

src/GraphQL.Benchmarks/Benchmarks/DetailedBenchmark.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ public Validation.Variables ParseVariables()
223223
Schema = Schema,
224224
Variables = Inputs ?? Inputs.Empty,
225225
Operation = Operation,
226-
}.GetVariableValues();
226+
}.GetVariablesValues().Variables;
227227
}
228228

229229
private static readonly DocumentValidator _documentValidator = new DocumentValidator();

src/GraphQL/Validation/DocumentValidator.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,13 @@ public class DocumentValidator : IDocumentValidator
117117
}
118118

119119
// can report errors even without rules enabled
120-
variables = context.GetVariableValues(variableVisitors == null ? null : variableVisitors.Count == 1 ? variableVisitors[0] : new CompositeVariableVisitor(variableVisitors));
120+
(variables, var errors) = context.GetVariablesValues(variableVisitors == null ? null : variableVisitors.Count == 1 ? variableVisitors[0] : new CompositeVariableVisitor(variableVisitors));
121+
122+
if (errors != null)
123+
{
124+
foreach (var error in errors)
125+
context.ReportError(error);
126+
}
121127

122128
return context.HasErrors
123129
? (new ValidationResult(context.Errors), variables)

src/GraphQL/Validation/ValidationContext.cs

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -118,16 +118,39 @@ public List<GraphQLFragmentSpread> GetFragmentSpreads(GraphQLSelectionSet node)
118118

119119
/// <summary>
120120
/// Returns all of the variable values defined for the operation from the attached <see cref="Variables"/> object.
121+
/// Only correctly validated variables are returned. If the variable is specified incorrectly, then an instance of
122+
/// <see cref="ValidationError"/> is added to the <see cref="Errors"/>.
121123
/// </summary>
124+
[Obsolete("This method can repeatedly add the same error into ValidationContext.Errors collection when called multiple times. Use GetVariablesValues method instead.")]
122125
public Variables GetVariableValues(IVariableVisitor? visitor = null)
126+
{
127+
(var variables, var errors) = GetVariablesValues(visitor);
128+
129+
if (errors != null)
130+
{
131+
foreach (var error in errors)
132+
ReportError(error);
133+
}
134+
135+
return variables;
136+
}
137+
138+
139+
/// <summary>
140+
/// Returns all of the variable values defined for the operation from the attached <see cref="Variables"/> object.
141+
/// Only correctly validated variables are returned. If the variable is specified incorrectly, then an instance of
142+
/// <see cref="ValidationError"/> is returned within the list of errors.
143+
/// </summary>
144+
public (Variables Variables, List<ValidationError>? Errors) GetVariablesValues(IVariableVisitor? visitor = null)
123145
{
124146
var variableDefinitions = Operation?.Variables;
125147

126148
if ((variableDefinitions?.Count ?? 0) == 0)
127149
{
128-
return Validation.Variables.None;
150+
return (Validation.Variables.None, null);
129151
}
130152

153+
List<ValidationError>? errors = null;
131154
var variablesObj = new Variables(variableDefinitions!.Count);
132155

133156
if (variableDefinitions != null)
@@ -140,7 +163,7 @@ public Variables GetVariableValues(IVariableVisitor? visitor = null)
140163

141164
if (graphType == null)
142165
{
143-
ReportError(new InvalidVariableError(this, variableDef, variableDefName, $"Variable has unknown type '{variableDef.Type.Name()}'"));
166+
(errors ??= new()).Add(new InvalidVariableError(this, variableDef, variableDefName, $"Variable has unknown type '{variableDef.Type.Name()}'"));
144167
continue;
145168
}
146169

@@ -157,7 +180,7 @@ public Variables GetVariableValues(IVariableVisitor? visitor = null)
157180
}
158181
catch (ValidationError error)
159182
{
160-
ReportError(error);
183+
(errors ??= new()).Add(error);
161184
continue;
162185
}
163186
}
@@ -172,14 +195,14 @@ public Variables GetVariableValues(IVariableVisitor? visitor = null)
172195
}
173196
catch (Exception ex)
174197
{
175-
ReportError(new InvalidVariableError(this, variableDef, variableDefName, "Error coercing default value.", ex));
198+
(errors ??= new()).Add(new InvalidVariableError(this, variableDef, variableDefName, "Error coercing default value.", ex));
176199
continue;
177200
}
178201
variable.IsDefault = true;
179202
}
180203
else if (graphType is NonNullGraphType)
181204
{
182-
ReportError(new InvalidVariableError(this, variableDef, variable.Name, "No value provided for a non-null variable."));
205+
(errors ??= new()).Add(new InvalidVariableError(this, variableDef, variable.Name, "No value provided for a non-null variable."));
183206
continue;
184207
}
185208

@@ -191,7 +214,7 @@ public Variables GetVariableValues(IVariableVisitor? visitor = null)
191214
}
192215

193216
// return the list of parsed variables defined for the operation
194-
return variablesObj;
217+
return (variablesObj, errors);
195218
}
196219

197220
/// <summary>

0 commit comments

Comments
 (0)