예제 #1
0
    private static bool TryCompleteOtherListValue(
        IOperationContext operationContext,
        MiddlewareContext resolverContext,
        ISelection selection,
        Path path,
        IType fieldType,
        string responseName,
        int responseIndex,
        object?result,
        List <ResolverTask> bufferedTasks,
        out object?completedResult)
    {
        ResultList resultList  = operationContext.Result.RentResultList();
        IType      elementType = fieldType.InnerType();

        resultList.IsNullable = elementType.Kind is not TypeKind.NonNull;
        var isElementList = elementType.IsListType();

        if (result is Array array)
        {
            for (var i = 0; i < array.Length; i++)
            {
                if (!TryCompleteElement(path.Append(i), array.GetValue(i)))
                {
                    completedResult = null;
                    return(true);
                }
            }

            completedResult = resultList;
            return(true);
        }

        if (result is IList list)
        {
            for (var i = 0; i < list.Count; i++)
            {
                if (!TryCompleteElement(path.Append(i), list[i]))
                {
                    completedResult = null;
                    return(true);
                }
            }

            completedResult = resultList;
            return(true);
        }

        if (result is IEnumerable enumerable)
        {
            var index = 0;

            foreach (var element in enumerable)
            {
                if (!TryCompleteElement(path.Append(index++), element))
                {
                    completedResult = null;
                    return(true);
                }
            }

            completedResult = resultList;
            return(true);
        }

        ReportError(
            operationContext,
            resolverContext,
            selection,
            ListValueIsNotSupported(resultList.GetType(), selection.SyntaxNode, path));

        completedResult = null;
        return(false);

        bool TryCompleteElement(Path elementPath, object?elementResult)
        {
            if (TryComplete(
                    operationContext,
                    resolverContext,
                    selection,
                    elementPath,
                    elementType,
                    responseName,
                    responseIndex,
                    elementResult,
                    bufferedTasks,
                    out var completedElement) &&
                completedElement is not null)
            {
                resultList.Add(completedElement);

                if (isElementList)
                {
                    ((IHasResultDataParent)completedElement).Parent = resultList;
                }
            }
            else if (resultList.IsNullable)
            {
                resultList.Add(null);
            }
            else
            {
                return(false);
            }

            return(true);
        }
    }