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();
            }
        }
Пример #4
0
        }     //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);
        }
Пример #5
0
 public InvalidInputException(NamedRequestObject anchor, Exception inner) : base(inner.Message, inner)
 {
     Anchor = anchor;
 }
Пример #6
0
        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);
        }