private List <SelectionItem> BuildSelectionItemsList(Node selSetNode, NamedRequestObject parentItem) { var selItems = new List <SelectionItem>(); foreach (var selNode in selSetNode.ChildNodes) { SelectionItem selItem = null; switch (selNode.Term.Name) { case TermNames.SelField: selItem = BuildSelectionField(selNode, parentItem); break; case TermNames.FragmSpread: var name = selNode.ChildNodes[1].GetText(); selItem = new FragmentSpread() { Name = name, SourceLocation = selNode.GetLocation() }; var dirListNode = selNode.FindChild(TermNames.DirListOpt); selItem.Directives = BuildDirectives(dirListNode, DirectiveLocation.Field, selItem); break; case TermNames.InlineFragm: selItem = BuildInlineFragment(selNode); break; } if (selItem != null) { selItems.Add(selItem); } } return(selItems); }
private List <InputValue> BuildArguments(IList <Node> argNodes, NamedRequestObject owner) { var args = new List <InputValue>(); var allNames = new HashSet <string>(); foreach (var argNode in argNodes) { var argName = argNode.ChildNodes[0].GetText(); _path.Push(argName); if (allNames.Contains(argName)) { AddError($"Duplicate argument '{argName}'.", argNode); continue; } allNames.Add(argName); var arg = new InputValue() { Name = argName, Parent = owner, SourceLocation = argNode.GetLocation() }; arg.ValueSource = BuildInputValue(argNode.ChildNodes[1], arg); args.Add(arg); _path.Pop(); } return(args); }
private SelectionField BuildSelectionField(Node selNode, NamedRequestObject parentItem) { var selFld = new SelectionField() { Parent = parentItem, SourceLocation = selNode.GetLocation() }; var nameNode = selNode.FindChild(TermNames.AliasedName); AssignNameAlias(selFld, nameNode); try { _path.Push(selFld.Key); // arguments // the actual arg list is 2 levels below var argsListOptNode = selNode.FindChild(TermNames.ArgListOpt); // TODO: refactor, this is temp fix var argNodes = (argsListOptNode != null) ? argsListOptNode.ChildNodes : new List <ParseTreeNode>(); selFld.Args = BuildArguments(argNodes, selFld); // directives var dirListNode = selNode.FindChild(TermNames.DirListOpt); selFld.Directives = BuildDirectives(dirListNode, DirectiveLocation.Field, selFld); // If the field is an object/interface itself, it should have it's own selection set var selSubSetNode = selNode.FindChild(TermNames.SelSet); if (selSubSetNode != null && selSubSetNode.ChildNodes.Count > 0) { var items = BuildSelectionItemsList(selSubSetNode, selFld); selFld.SelectionSubset = new SelectionSubset(selFld, items, selSubSetNode.GetLocation()); } return(selFld); } finally { _path.Pop(); } }
} //method private MappedSelectionSubSet GetMappedSubset(SelectionSubset subSet, IList <ObjectTypeDef> objectTypeDefs, Type entityType, NamedRequestObject requestObj) { var mappedSubset = subSet.MappedSubSets.FirstOrDefault( ms => (ms.Mapping.EntityType == entityType || ms.Mapping.EntityType.IsAssignableFrom(entityType)) && objectTypeDefs.Contains(ms.Mapping.TypeDef)); if (mappedSubset == null) { var types = string.Join(",", objectTypeDefs); this._requestContext.AddError($"Failed to find mapping from entity type {entityType} to GraphQLType(s) [{types}].", requestObj); AbortRequest(); } return(mappedSubset); }
public InvalidInputException(NamedRequestObject anchor, Exception inner) : base(inner.Message, inner) { Anchor = anchor; }
public IList <MappedArg> MapArguments(IList <InputValue> args, IList <InputValueDef> argDefs, NamedRequestObject owner) { args ??= InputValue.EmptyList; var hasArgs = args.Count > 0; var hasArgDefs = argDefs.Count > 0; // argDefs are never null // some corner cases first if (!hasArgDefs && !hasArgs) { return(MappedArg.EmptyList); } if (!hasArgDefs && hasArgs) { AddError($"No arguments are expected for '{owner.Name}'", owner); return(MappedArg.EmptyList); } // we have args and argDefs; first check that arg names are valid var unknownArgs = args.Where(a => !argDefs.Any(ad => ad.Name == a.Name)).ToList(); if (unknownArgs.Count > 0) { foreach (var ua in unknownArgs) { AddError($"Field(dir) '{owner.Name}': argument '{ua.Name}' not defined.", ua); } return(MappedArg.EmptyList); } // build Mapped Arg list - full list of args in right order matching the resolver method var mappedArgs = new List <MappedArg>(); foreach (var argDef in argDefs) { var arg = args.FirstOrDefault(a => a.Name == argDef.Name); if (arg == null) { // nullable args have default value null if (argDef.HasDefaultValue || !argDef.TypeRef.IsNotNull) { var constValue = CreateConstantInputValue(argDef, owner, argDef.TypeRef, argDef.DefaultValue); var MappedSelectionFieldArg = new MappedArg() { Anchor = owner, ArgDef = argDef, Evaluator = constValue }; mappedArgs.Add(MappedSelectionFieldArg); } else { AddError($"Field(dir) '{owner.Name}': argument '{argDef.Name}' value is missing.", owner); } continue; } // arg != null try { var argEval = GetInputValueEvaluator(argDef, arg.ValueSource, argDef.TypeRef); var outArg = new MappedArg() { Anchor = arg, ArgDef = argDef, Evaluator = argEval }; mappedArgs.Add(outArg); } catch (InvalidInputException bvEx) { _requestContext.AddInputError(bvEx); continue; } catch (Exception ex) { throw new InvalidInputException(ex.Message, arg.ValueSource, ex); } } //foreach argDef return(mappedArgs); }