@@ -41,6 +41,22 @@ type documentTopLevelNodes struct {
4141 webhooks documentTopLevelNode
4242}
4343
44+ func selectDocumentNode (root * yaml.Node , preferred documentTopLevelNode , label string , topOnly bool ) documentTopLevelNode {
45+ if preferred .value != nil {
46+ return preferred
47+ }
48+ root = utils .NodeAlias (root )
49+ if root == nil {
50+ return documentTopLevelNode {}
51+ }
52+ if topOnly {
53+ _ , key , value := utils .FindKeyNodeFullTop (label , root .Content )
54+ return documentTopLevelNode {key : key , value : value }
55+ }
56+ _ , key , value := utils .FindKeyNodeFull (label , root .Content )
57+ return documentTopLevelNode {key : key , value : value }
58+ }
59+
4460func collectDocumentTopLevelNodes (root * yaml.Node ) documentTopLevelNodes {
4561 root = utils .NodeAlias (root )
4662 var nodes documentTopLevelNodes
@@ -119,7 +135,8 @@ func CreateDocumentFromConfig(info *datamodel.SpecInfo, config *datamodel.Docume
119135func createDocument (info * datamodel.SpecInfo , config * datamodel.DocumentConfiguration ) (* Document , error ) {
120136 rootNode := utils .NodeAlias (info .RootNode .Content [0 ])
121137 topNodes := collectDocumentTopLevelNodes (rootNode )
122- labelNode , versionNode := topNodes .version .key , topNodes .version .value
138+ versionNodeRef := selectDocumentNode (rootNode , topNodes .version , OpenAPILabel , false )
139+ labelNode , versionNode := versionNodeRef .key , versionNodeRef .value
123140 var version low.NodeReference [string ]
124141 if versionNode == nil {
125142 return nil , errors .New ("no openapi version/tag found, cannot create document" )
@@ -291,15 +308,17 @@ func createDocument(info *datamodel.SpecInfo, config *datamodel.DocumentConfigur
291308 low .ExtractExtensionNodes (ctx , doc .Extensions , doc .Nodes )
292309
293310 // if set, extract jsonSchemaDialect (3.1)
294- dialectLabel , dialectNode := topNodes .jsonSchemaDialect .key , topNodes .jsonSchemaDialect .value
311+ dialectRef := selectDocumentNode (rootNode , topNodes .jsonSchemaDialect , JSONSchemaDialectLabel , false )
312+ dialectLabel , dialectNode := dialectRef .key , dialectRef .value
295313 if dialectNode != nil {
296314 doc .JsonSchemaDialect = low.NodeReference [string ]{
297315 Value : dialectNode .Value , KeyNode : dialectLabel , ValueNode : dialectNode ,
298316 }
299317 }
300318
301319 // if set, extract $self (3.2)
302- selfLabel , selfNode := topNodes .self .key , topNodes .self .value
320+ selfRef := selectDocumentNode (rootNode , topNodes .self , SelfLabel , false )
321+ selfLabel , selfNode := selfRef .key , selfRef .value
303322 if selfNode != nil {
304323 doc .Self = low.NodeReference [string ]{
305324 Value : selfNode .Value , KeyNode : selfLabel , ValueNode : selfNode ,
@@ -341,8 +360,9 @@ func createDocument(info *datamodel.SpecInfo, config *datamodel.DocumentConfigur
341360 return & doc , errors .Join (errs ... )
342361}
343362
344- func extractInfo (ctx context.Context , _ * yaml.Node , nodes documentTopLevelNodes , doc * Document , idx * index.SpecIndex ) error {
345- ln , vn := nodes .info .key , nodes .info .value
363+ func extractInfo (ctx context.Context , root * yaml.Node , nodes documentTopLevelNodes , doc * Document , idx * index.SpecIndex ) error {
364+ nodeRef := selectDocumentNode (root , nodes .info , base .InfoLabel , true )
365+ ln , vn := nodeRef .key , nodeRef .value
346366 if vn != nil {
347367 ir := base.Info {}
348368 _ = low .BuildModel (vn , & ir )
@@ -373,8 +393,9 @@ func extractExternalDocs(ctx context.Context, root *yaml.Node, nodes documentTop
373393 return nil
374394}
375395
376- func extractComponents (ctx context.Context , _ * yaml.Node , nodes documentTopLevelNodes , doc * Document , idx * index.SpecIndex ) error {
377- ln , vn := nodes .components .key , nodes .components .value
396+ func extractComponents (ctx context.Context , root * yaml.Node , nodes documentTopLevelNodes , doc * Document , idx * index.SpecIndex ) error {
397+ nodeRef := selectDocumentNode (root , nodes .components , ComponentsLabel , true )
398+ ln , vn := nodeRef .key , nodeRef .value
378399 if vn != nil {
379400 ir := Components {}
380401 _ = low .BuildModel (vn , & ir )
@@ -388,8 +409,9 @@ func extractComponents(ctx context.Context, _ *yaml.Node, nodes documentTopLevel
388409 return nil
389410}
390411
391- func extractServers (ctx context.Context , _ * yaml.Node , nodes documentTopLevelNodes , doc * Document , idx * index.SpecIndex ) error {
392- ln , vn := nodes .servers .key , nodes .servers .value
412+ func extractServers (ctx context.Context , root * yaml.Node , nodes documentTopLevelNodes , doc * Document , idx * index.SpecIndex ) error {
413+ nodeRef := selectDocumentNode (root , nodes .servers , ServersLabel , false )
414+ ln , vn := nodeRef .key , nodeRef .value
393415 if vn != nil {
394416 if utils .IsNodeArray (vn ) {
395417 var servers []low.ValueReference [* Server ]
@@ -414,8 +436,9 @@ func extractServers(ctx context.Context, _ *yaml.Node, nodes documentTopLevelNod
414436 return nil
415437}
416438
417- func extractTags (ctx context.Context , _ * yaml.Node , nodes documentTopLevelNodes , doc * Document , idx * index.SpecIndex ) error {
418- ln , vn := nodes .tags .key , nodes .tags .value
439+ func extractTags (ctx context.Context , root * yaml.Node , nodes documentTopLevelNodes , doc * Document , idx * index.SpecIndex ) error {
440+ nodeRef := selectDocumentNode (root , nodes .tags , base .TagsLabel , false )
441+ ln , vn := nodeRef .key , nodeRef .value
419442 if vn != nil {
420443 if utils .IsNodeArray (vn ) {
421444 var tags []low.ValueReference [* base.Tag ]
@@ -442,8 +465,9 @@ func extractTags(ctx context.Context, _ *yaml.Node, nodes documentTopLevelNodes,
442465 return nil
443466}
444467
445- func extractPaths (ctx context.Context , _ * yaml.Node , nodes documentTopLevelNodes , doc * Document , idx * index.SpecIndex ) error {
446- ln , vn := nodes .paths .key , nodes .paths .value
468+ func extractPaths (ctx context.Context , root * yaml.Node , nodes documentTopLevelNodes , doc * Document , idx * index.SpecIndex ) error {
469+ nodeRef := selectDocumentNode (root , nodes .paths , PathsLabel , false )
470+ ln , vn := nodeRef .key , nodeRef .value
447471 if vn != nil {
448472 ir := Paths {}
449473 err := ir .Build (ctx , ln , vn , idx )
0 commit comments