/// <summary> /// Converts the input variable collection to their type-expression-bound values in context of the /// operation being executed. /// </summary> /// <param name="inputVariables">The input variables.</param> /// <returns>IResolvedVariableCollection.</returns> public IResolvedVariableCollection Resolve(IInputVariableCollection inputVariables) { if (inputVariables == null || inputVariables.Count == 0) { return(ResolvedVariableCollection.Empty); } var resolverGenerator = new InputResolverMethodGenerator(_schema); var result = new ResolvedVariableCollection(); foreach (var variable in _operation.DeclaredVariables.Values) { var resolver = resolverGenerator.CreateResolver(variable.TypeExpression); IResolvableItem resolvableItem = null; var found = inputVariables.TryGetVariable(variable.Name, out var suppliedValue); resolvableItem = found ? suppliedValue : variable.Value as IResolvableItem; var resolvedValue = resolver.Resolve(resolvableItem); var resolvedVariable = new ResolvedVariable(variable.Name, variable.TypeExpression, resolvedValue); result.AddVariable(resolvedVariable); } return(result); }
/// <summary> /// Resolves the provided query input value to the .NET object rendered by this resolver. /// This input value is garunteed to not be a variable reference. /// </summary> /// <param name="resolvableItem">The resolvable item.</param> /// <returns>System.Object.</returns> protected override object ResolveFromItem(IResolvableItem resolvableItem) { if (!(resolvableItem is IResolvableFieldSet fieldSEt)) { return(null); } var instance = InstanceFactory.CreateInstance(_objectType); foreach (var argument in fieldSEt.Fields) { var argResolver = _fieldResolvers.ContainsKey(argument.Key) ? _fieldResolvers[argument.Key] : null; PropertySetterInvoker propSetter = null; var field = _graphType.Fields.FindField(argument.Key) as ITypedItem; if (field != null) { propSetter = _propSetters.ContainsKey(field.InternalName) ? _propSetters[field.InternalName] : null; } if (argResolver == null || propSetter == null) { continue; } var resolvedValue = argResolver .WithVariables(this.VariableCollection) .Resolve(argument.Value); propSetter(instance, resolvedValue); } return(instance); }
/// <summary> /// Resolves the provided query input value to the .NET object rendered by this resolver. /// This input value is garunteed to not be a variable reference. /// </summary> /// <param name="resolvableItem">The resolvable item.</param> /// <returns>System.Object.</returns> protected override object ResolveFromItem(IResolvableItem resolvableItem) { if (resolvableItem is IResolvableValue resolvableValue) { return(_scalarResolver.Resolve(resolvableValue.ResolvableValue)); } return(null); }
/// <summary> /// Attempts to retrieve a field by its name. /// </summary> /// <param name="fieldName">Name of the field.</param> /// <param name="field">The field that was found, if any.</param> /// <returns><c>true</c> if the field was found and successfully returned, <c>false</c> otherwise.</returns> bool IResolvableFieldSet.TryGetField(string fieldName, out IResolvableItem field) { field = null; var found = _fields.TryGetValue(fieldName, out var item); if (found) { field = item; } return(found); }
/// <summary> /// Resolves the provided query input value to the .NET object rendered by this resolver. /// This input value is garunteed to not be a variable reference. /// </summary> /// <param name="resolvableItem">The resolvable item.</param> /// <returns>System.Object.</returns> protected override object ResolveFromItem(IResolvableItem resolvableItem) { if (resolvableItem is IResolvableList resolvableList) { var listType = typeof(List <>).MakeGenericType(_listItemType); var listInstance = InstanceFactory.CreateInstance(listType) as IList; foreach (var item in resolvableList.ListItems) { listInstance.Add(_itemResolver.WithVariables(this.VariableCollection).Resolve(item)); } return(listInstance); } return(null); }
/// <summary> /// Resolves the specified query input value to the .NET object rendered by this resolver. /// </summary> /// <param name="resolvableItem">The resolvable item.</param> /// <returns>object.</returns> public object Resolve(IResolvableItem resolvableItem) { if (resolvableItem is IResolvablePointer pointer) { IResolvedVariable variable = null; var variableFound = this.VariableCollection?.TryGetValue(pointer.PointsTo, out variable) ?? false; if (variableFound) { return(variable.Value); } resolvableItem = pointer.DefaultItem; } return(this.ResolveFromItem(resolvableItem)); }
/// <summary> /// Resolves the provided query input value to the .NET object rendered by this resolver. /// This input value is garunteed to not be a variable reference. /// </summary> /// <param name="resolvableItem">The resolvable item.</param> /// <returns>System.Object.</returns> protected override object ResolveFromItem(IResolvableItem resolvableItem) { string value = null; try { if (resolvableItem is IResolvableValue resolvableValue) { // enums may be as delimited strings (read from variables collection) // or as non-delimited strings (read from a query document) value = GraphQLStrings.UnescapeAndTrimDelimiters(resolvableValue.ResolvableValue, false); return(Enum.Parse(_enumType, value, true)); } } catch { // ignored } return(null); }
/// <summary> /// Resolves the provided query input value to the .NET object rendered by this resolver. /// This input value is garunteed to not be a variable reference. /// </summary> /// <param name="resolvableItem">The resolvable item.</param> /// <returns>System.Object.</returns> protected abstract object ResolveFromItem(IResolvableItem resolvableItem);