kiota
kiota copied to clipboard
Property with empty name raises hard to understand error
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()
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?
gentle reminder on this @gadcam
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.