kiota icon indicating copy to clipboard operation
kiota copied to clipboard

Property with empty name raises hard to understand error

Open gadcam opened this issue 11 months ago • 2 comments

Hello,

First thanks a lot for this wonderful tool! We tried to consume a YAML (which we do not have control over) and there was something like this inside the YAML

components:
  schemas:
    MyType:
      allOf:
        - $ref: '#/components/schemas/MyOtherType'
        - type: object
          properties:
            '':
              type: string

Which is apparently valid (at least neither Kiota nor Swagger editor raise an issue regarding this file)

Even with the traces activated we had only this message

Critical: KiotaBuilder error generating the client: One or more errors occurred. (The value cannot be an empty string. (Parameter 'serializationName'))

which was hard to debug without digging into Kiota internal : I ended up cloning the repo.

Removing the empty property fixed the issue.

Maybe doing the null or empty check here would enable to show a more useful message ? https://github.com/microsoft/kiota/blob/48505785435910859c64592416cb43e6566410b6/src/Kiota.Builder/KiotaBuilder.cs#L2038-L2042

Or maybe it is a more general issue of how to log exceptions.

Here is the full stacktrace

Unhandled exception: System.AggregateException: One or more errors occurred. (The value cannot be an empty string. (Parameter 'serializationName'))
 ---> System.ArgumentException: The value cannot be an empty string. (Parameter 'serializationName')
   at System.ArgumentException.ThrowNullOrEmptyException(String argument, String paramName)
   at System.ArgumentException.ThrowIfNullOrEmpty(String argument, String paramName)
   at Kiota.Builder.CodeDOM.CodeClass.GetOriginalPropertyDefinedFromBaseType(String serializationName) in \kiota\src\Kiota.Builder\CodeDOM\CodeClass.cs:line 167
   at Kiota.Builder.CodeDOM.CodeClass.<AddProperty>b__12_0(CodeProperty property) in \kiota\src\Kiota.Builder\CodeDOM\CodeClass.cs:line 84
   at System.Linq.Enumerable.SelectArrayIterator`2.Fill(ReadOnlySpan`1 source, Span`1 destination, Func`2 func)
   at System.Linq.Enumerable.SelectArrayIterator`2.ToArray()
   at Kiota.Builder.CodeDOM.CodeClass.AddProperty(CodeProperty[] properties) in \kiota\src\Kiota.Builder\CodeDOM\CodeClass.cs:line 80
   at Kiota.Builder.KiotaBuilder.CreatePropertiesForModelClass(OpenApiUrlTreeNode currentNode, OpenApiSchema schema, CodeNamespace ns, CodeClass model) in \kiota\src\Kiota.Builder\KiotaBuilder.cs:line 2057
   at Kiota.Builder.KiotaBuilder.AddModelClass(OpenApiUrlTreeNode currentNode, OpenApiSchema schema, String declarationName, CodeNamespace currentNamespace, CodeClass inheritsFrom) in \kiota\src\Kiota.Builder\KiotaBuilder.cs:line 1823
   at Kiota.Builder.KiotaBuilder.AddModelDeclarationIfDoesntExist(OpenApiUrlTreeNode currentNode, OpenApiSchema schema, String declarationName, CodeNamespace currentNamespace, CodeClass inheritsFrom) in \kiota\src\Kiota.Builder\KiotaBuilder.cs:line 1706
   at Kiota.Builder.KiotaBuilder.GetCodeTypeForMapping(OpenApiUrlTreeNode currentNode, String referenceId, CodeNamespace currentNamespace, CodeClass baseClass, OpenApiSchema currentSchema) in \kiota\src\Kiota.Builder\KiotaBuilder.cs:line 2028
   at Kiota.Builder.KiotaBuilder.<>c__DisplayClass99_0.<GetDiscriminatorMappings>b__0(KeyValuePair`2 x) in \kiota\src\Kiota.Builder\KiotaBuilder.cs:line 1844
   at System.Linq.Enumerable.SelectEnumerableIterator`2.MoveNext()
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Linq.Enumerable.WhereEnumerableIterator`1.ToList()
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at Kiota.Builder.KiotaBuilder.AddDiscriminatorMethod(CodeClass newClass, String discriminatorPropertyName, IEnumerable`1 discriminatorMappings, Func`2 refineMethodName) in \kiota\src\Kiota.Builder\KiotaBuilder.cs:line 2002
   at Kiota.Builder.KiotaBuilder.AddModelClass(OpenApiUrlTreeNode currentNode, OpenApiSchema schema, String declarationName, CodeNamespace currentNamespace, CodeClass inheritsFrom) in \kiota\src\Kiota.Builder\KiotaBuilder.cs:line 1838
   at Kiota.Builder.KiotaBuilder.AddModelDeclarationIfDoesntExist(OpenApiUrlTreeNode currentNode, OpenApiSchema schema, String declarationName, CodeNamespace currentNamespace, CodeClass inheritsFrom) in \kiota\src\Kiota.Builder\KiotaBuilder.cs:line 1706
   at Kiota.Builder.KiotaBuilder.CreateInheritedModelDeclaration(OpenApiUrlTreeNode currentNode, OpenApiSchema schema, OpenApiOperation operation, String classNameSuffix, CodeNamespace codeNamespace, Boolean isRequestBody) in \kiota\src\Kiota.Builder\KiotaBuilder.cs:line 1529
   at Kiota.Builder.KiotaBuilder.CreateModelDeclarations(OpenApiUrlTreeNode currentNode, OpenApiSchema schema, OpenApiOperation operation, CodeElement parentElement, String suffixForInlineSchema, OpenApiResponse response, String typeNameForInlineSchema, Boolean isRequestBody) in \kiota\src\Kiota.Builder\KiotaBuilder.cs:line 1637
   at Kiota.Builder.KiotaBuilder.CreateCollectionModelDeclaration(OpenApiUrlTreeNode currentNode, OpenApiSchema schema, OpenApiOperation operation, CodeNamespace codeNamespace, String typeNameForInlineSchema, Boolean isRequestBody) in \kiota\src\Kiota.Builder\KiotaBuilder.cs:line 1681
   at Kiota.Builder.KiotaBuilder.CreateModelDeclarations(OpenApiUrlTreeNode currentNode, OpenApiSchema schema, OpenApiOperation operation, CodeElement parentElement, String suffixForInlineSchema, OpenApiResponse response, String typeNameForInlineSchema, Boolean isRequestBody) in \kiota\src\Kiota.Builder\KiotaBuilder.cs:line 1661
   at Kiota.Builder.KiotaBuilder.<>c__DisplayClass115_0.<CreatePropertiesForModelClass>b__0(KeyValuePair`2 x) in \kiota\src\Kiota.Builder\KiotaBuilder.cs:line 2046
   at System.Linq.Enumerable.SelectEnumerableIterator`2.MoveNext()
   at System.Linq.Enumerable.OfTypeIterator[TResult](IEnumerable source)+MoveNext()
   at System.Collections.Generic.LargeArrayBuilder`1.AddRange(IEnumerable`1 items)
   at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable`1 source)
   at Kiota.Builder.KiotaBuilder.CreatePropertiesForModelClass(OpenApiUrlTreeNode currentNode, OpenApiSchema schema, CodeNamespace ns, CodeClass model) in \kiota\src\Kiota.Builder\KiotaBuilder.cs:line 2038
   at Kiota.Builder.KiotaBuilder.AddModelClass(OpenApiUrlTreeNode currentNode, OpenApiSchema schema, String declarationName, CodeNamespace currentNamespace, CodeClass inheritsFrom) in \kiota\src\Kiota.Builder\KiotaBuilder.cs:line 1823
   at Kiota.Builder.KiotaBuilder.AddModelDeclarationIfDoesntExist(OpenApiUrlTreeNode currentNode, OpenApiSchema schema, String declarationName, CodeNamespace currentNamespace, CodeClass inheritsFrom) in \kiota\src\Kiota.Builder\KiotaBuilder.cs:line 1706
   at Kiota.Builder.KiotaBuilder.CreateModelDeclarationAndType(OpenApiUrlTreeNode currentNode, OpenApiSchema schema, OpenApiOperation operation, CodeNamespace codeNamespace, String classNameSuffix, OpenApiResponse response, String typeNameForInlineSchema, Boolean isRequestBody) in \kiota\src\Kiota.Builder\KiotaBuilder.cs:line 1507
   at Kiota.Builder.KiotaBuilder.CreateModelDeclarations(OpenApiUrlTreeNode currentNode, OpenApiSchema schema, OpenApiOperation operation, CodeElement parentElement, String suffixForInlineSchema, OpenApiResponse response, String typeNameForInlineSchema, Boolean isRequestBody) in \kiota\src\Kiota.Builder\KiotaBuilder.cs:line 1655
   at Kiota.Builder.KiotaBuilder.GetExecutorMethodReturnType(OpenApiUrlTreeNode currentNode, OpenApiSchema schema, OpenApiOperation operation, CodeClass parentClass, OperationType operationType) in \kiota\src\Kiota.Builder\KiotaBuilder.cs:line 1130
   at Kiota.Builder.KiotaBuilder.CreateOperationMethods(OpenApiUrlTreeNode currentNode, OperationType operationType, OpenApiOperation operation, CodeClass parentClass) in \kiota\src\Kiota.Builder\KiotaBuilder.cs:line 1216
   at Kiota.Builder.KiotaBuilder.CreateRequestBuilderClass(CodeNamespace currentNamespace, OpenApiUrlTreeNode currentNode, OpenApiUrlTreeNode rootNode) in \kiota\src\Kiota.Builder\KiotaBuilder.cs:line 583
   at Kiota.Builder.KiotaBuilder.<>c__DisplayClass47_0.<CreateRequestBuilderClass>b__0(OpenApiUrlTreeNode childNode) in \kiota\src\Kiota.Builder\KiotaBuilder.cs:line 593
   at System.Threading.Tasks.Parallel.<>c__DisplayClass43_0`2.<PartitionerForEachWorker>b__1(IEnumerator& partitionState, Int64 timeout, Boolean& replicationDelegateYieldedBeforeCompletion)
--- End of stack trace from previous location ---
   at System.Threading.Tasks.Parallel.<>c__DisplayClass43_0`2.<PartitionerForEachWorker>b__1(IEnumerator& partitionState, Int64 timeout, Boolean& replicationDelegateYieldedBeforeCompletion)
   at System.Threading.Tasks.TaskReplicator.Replica.Execute()
   --- End of inner exception stack trace ---
   at System.Threading.Tasks.TaskReplicator.Run[TState](ReplicatableUserAction`1 action, ParallelOptions options, Boolean stopOnFirstFailure)
   at System.Threading.Tasks.Parallel.PartitionerForEachWorker[TSource,TLocal](Partitioner`1 source, ParallelOptions parallelOptions, Action`1 simpleBody, Action`2 bodyWithState, Action`3 bodyWithStateAndIndex, Func`4 bodyWithStateAndLocal, Func`5 bodyWithEverything, Func`1 localInit, Action`1 localFinally)
--- End of stack trace from previous location ---
   at System.Threading.Tasks.Parallel.PartitionerForEachWorker[TSource,TLocal](Partitioner`1 source, ParallelOptions parallelOptions, Action`1 simpleBody, Action`2 bodyWithState, Action`3 bodyWithStateAndIndex, Func`4 bodyWithStateAndLocal, Func`5 bodyWithEverything, Func`1 localInit, Action`1 localFinally)
   at System.Threading.Tasks.Parallel.ForEachWorker[TSource,TLocal](IEnumerable`1 source, ParallelOptions parallelOptions, Action`1 body, Action`2 bodyWithState, Action`3 bodyWithStateAndIndex, Func`4 bodyWithStateAndLocal, Func`5 bodyWithEverything, Func`1 localInit, Action`1 localFinally)
   at System.Threading.Tasks.Parallel.ForEach[TSource](IEnumerable`1 source, ParallelOptions parallelOptions, Action`1 body)
   at Kiota.Builder.KiotaBuilder.CreateRequestBuilderClass(CodeNamespace currentNamespace, OpenApiUrlTreeNode currentNode, OpenApiUrlTreeNode rootNode) in \kiota\src\Kiota.Builder\KiotaBuilder.cs:line 587
   at Kiota.Builder.KiotaBuilder.CreateSourceModel(OpenApiUrlTreeNode root) in \kiota\src\Kiota.Builder\KiotaBuilder.cs:line 453
   at Kiota.Builder.KiotaBuilder.GenerateClientAsync(CancellationToken cancellationToken) in \kiota\src\Kiota.Builder\KiotaBuilder.cs:line 257
   at Kiota.Builder.KiotaBuilder.GenerateClientAsync(CancellationToken cancellationToken) in \kiota\src\Kiota.Builder\KiotaBuilder.cs:line 285
   at kiota.Handlers.KiotaGenerateCommandHandler.InvokeAsync(InvocationContext context) in \kiota\src\kiota\Handlers\KiotaGenerateCommandHandler.cs:line 130
   at System.CommandLine.Invocation.InvocationPipeline.<>c__DisplayClass4_0.<<BuildInvocationChain>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass17_0.<<UseParseErrorReporting>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass12_0.<<UseHelp>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass22_0.<<UseVersionOption>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass19_0.<<UseTypoCorrections>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c.<<UseSuggestDirective>b__18_0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass16_0.<<UseParseDirective>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c.<<RegisterWithDotnetSuggest>b__5_0>d.MoveNext()
--- End of stack trace from previous location ---
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass8_0.<<UseExceptionHandler>b__0>d.MoveNext()

gadcam avatar Mar 12 '24 19:03 gadcam

Thanks for raising this this @gadcam

Looks like the check at the line below won't allow an empty string as much as its valid. It would ideally need to be changed to check if the string is null but not necessarily if empty.

https://github.com/microsoft/kiota/blob/48505785435910859c64592416cb43e6566410b6/src/Kiota.Builder/CodeDOM/CodeClass.cs#L167

Any chance you'd be willing to submit a PR for this change?

andrueastman avatar Mar 18 '24 10:03 andrueastman

gentle reminder on this @gadcam

baywet avatar May 17 '24 14:05 baywet

This issue has been automatically marked as stale because it has been marked as requiring author feedback but has not had any activity for 4 days. It will be closed if no further activity occurs within 3 days of this comment.