docs: protected FieldValueInfo completeValue(ExecutionContext executionContext, ExecutionStrategyParameters parameters) throws NonNullableFieldWasNullException {
          ExecutionStepInfo executionStepInfo = parameters.getExecutionStepInfo();
          Object result = UnboxPossibleOptional.unboxPossibleOptional(parameters.getSource());
          GraphQLType fieldType = executionStepInfo.getUnwrappedNonNullType();
          CompletableFuture<ExecutionResult> fieldValue;
  
          if (result == null) {
              fieldValue = completeValueForNull(parameters);
              return FieldValueInfo.newFieldValueInfo(NULL).fieldValue(fieldValue).build();
          } else if (isList(fieldType)) {
              return completeValueForList(executionContext, parameters, result);
          } else if (fieldType instanceof GraphQLScalarType) {
              fieldValue = completeValueForScalar(executionContext, parameters, (GraphQLScalarType) fieldType, result);
              return FieldValueInfo.newFieldValueInfo(SCALAR).fieldValue(fieldValue).build();
          } else if (fieldType instanceof GraphQLEnumType) {
              fieldValue = completeValueForEnum(executionContext, parameters, (GraphQLEnumType) fieldType, result);
              return FieldValueInfo.newFieldValueInfo(ENUM).fieldValue(fieldValue).build();
          }
  
          // when we are here, we have a complex type: Interface, Union or Object
          // and we must go deeper
          //
          GraphQLObjectType resolvedObjectType;
          try {
              resolvedObjectType = resolveType(executionContext, parameters, fieldType);
              fieldValue = completeValueForObject(executionContext, parameters, resolvedObjectType, result);
          } catch (UnresolvedTypeException ex) {
              // consider the result to be null and add the error on the context
              handleUnresolvedTypeProblem(executionContext, parameters, ex);
              // and validate the field is nullable, if non-nullable throw exception
              parameters.getNonNullFieldValidator().validate(parameters.getPath(), null);
              // complete the field as null
              fieldValue = completedFuture(new ExecutionResultImpl(null, null));
          }
          return FieldValueInfo.newFieldValueInfo(OBJECT).fieldValue(fieldValue).build();
      }