1- // Copyright 2022 Princess B33f Heavy Industries / Dave Shanley
1+ // Copyright 2022-2026 Princess B33f Heavy Industries / Dave Shanley
22// SPDX-License-Identifier: MIT
33
44package base
55
66import (
77 "context"
88 "hash/maphash"
9+ "sync"
910
1011 "github.com/pb33f/libopenapi/datamodel/low"
1112 "github.com/pb33f/libopenapi/index"
@@ -29,6 +30,8 @@ type Example struct {
2930 RootNode * yaml.Node
3031 index * index.SpecIndex
3132 context context.Context
33+ nodeStore sync.Map
34+ reference low.Reference
3235 * low.Reference
3336 low.NodeMap
3437}
@@ -86,14 +89,21 @@ func (ex *Example) Hash() uint64 {
8689// Build extracts extensions and example value
8790func (ex * Example ) Build (ctx context.Context , keyNode , root * yaml.Node , idx * index.SpecIndex ) error {
8891 ex .KeyNode = keyNode
89- ex .Reference = new (low.Reference )
92+ ex .reference = low.Reference {}
93+ ex .Reference = & ex .reference
9094 if ok , _ , ref := utils .IsNodeRefValue (root ); ok {
9195 ex .SetReference (ref , root )
9296 }
9397 root = utils .NodeAlias (root )
9498 ex .RootNode = root
9599 utils .CheckForMergeNodes (root )
96- ex .Nodes = low .ExtractNodes (ctx , root )
100+ ex .nodeStore = sync.Map {}
101+ ex .Nodes = & ex .nodeStore
102+ if len (root .Content ) > 0 {
103+ ex .NodeMap .ExtractNodes (root , false )
104+ } else {
105+ ex .AddNode (root .Line , root )
106+ }
97107 ex .Extensions = low .ExtractExtensions (root )
98108 ex .context = ctx
99109 ex .index = idx
@@ -109,14 +119,7 @@ func (ex *Example) Build(ctx context.Context, keyNode, root *yaml.Node, idx *ind
109119 ValueNode : vn ,
110120 }
111121
112- // extract nodes for all value nodes down the tree.
113- expChildNodes := low .ExtractNodesRecursive (ctx , vn )
114- expChildNodes .Range (func (k , v interface {}) bool {
115- if arr , ko := v .([]* yaml.Node ); ko {
116- ex .Nodes .Store (k , arr )
117- }
118- return true
119- })
122+ low .MergeRecursiveNodesIfLineAbsent (ex .Nodes , vn )
120123 }
121124
122125 // OpenAPI 3.2+ dataValue field
@@ -127,14 +130,7 @@ func (ex *Example) Build(ctx context.Context, keyNode, root *yaml.Node, idx *ind
127130 ValueNode : dataVn ,
128131 }
129132
130- // extract nodes for all dataValue nodes down the tree.
131- expChildNodes := low .ExtractNodesRecursive (ctx , dataVn )
132- expChildNodes .Range (func (k , v interface {}) bool {
133- if arr , ko := v .([]* yaml.Node ); ko {
134- ex .Nodes .Store (k , arr )
135- }
136- return true
137- })
133+ low .MergeRecursiveNodesIfLineAbsent (ex .Nodes , dataVn )
138134 }
139135
140136 // OpenAPI 3.2+ serializedValue field
0 commit comments