Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 32 additions & 9 deletions pkg/overlay/apply.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,22 +92,22 @@ func applyUpdateAction(root *yaml.Node, action Action) error {
nodes := p.Query(root)

for _, node := range nodes {
if err := updateNode(node, action.Update); err != nil {
if err := updateNode(node, &action.Update); err != nil {
return err
}
}

return nil
}

func updateNode(node *yaml.Node, updateNode yaml.Node) error {
func updateNode(node *yaml.Node, updateNode *yaml.Node) error {
mergeNode(node, updateNode)
return nil
}

func mergeNode(node *yaml.Node, merge yaml.Node) {
func mergeNode(node *yaml.Node, merge *yaml.Node) {
if node.Kind != merge.Kind {
*node = merge
*node = *clone(merge)
return
}
switch node.Kind {
Expand All @@ -122,7 +122,7 @@ func mergeNode(node *yaml.Node, merge yaml.Node) {

// mergeMappingNode will perform a shallow merge of the merge node into the main
// node.
func mergeMappingNode(node *yaml.Node, merge yaml.Node) {
func mergeMappingNode(node *yaml.Node, merge *yaml.Node) {
NextKey:
for i := 0; i < len(merge.Content); i += 2 {
mergeKey := merge.Content[i].Value
Expand All @@ -131,16 +131,39 @@ NextKey:
for j := 0; j < len(node.Content); j += 2 {
nodeKey := node.Content[j].Value
if nodeKey == mergeKey {
mergeNode(node.Content[j+1], *mergeValue)
mergeNode(node.Content[j+1], mergeValue)
continue NextKey
}
}

node.Content = append(node.Content, merge.Content[i], mergeValue)
node.Content = append(node.Content, merge.Content[i], clone(mergeValue))
}
}

// mergeSequenceNode will append the merge node's content to the original node.
func mergeSequenceNode(node *yaml.Node, merge yaml.Node) {
node.Content = append(node.Content, merge.Content...)
func mergeSequenceNode(node *yaml.Node, merge *yaml.Node) {
node.Content = append(node.Content, clone(merge).Content...)
}

func clone(node *yaml.Node) *yaml.Node {
newNode := &yaml.Node{
Kind: node.Kind,
Style: node.Style,
Tag: node.Tag,
Value: node.Value,
Anchor: node.Anchor,
HeadComment: node.HeadComment,
LineComment: node.LineComment,
FootComment: node.FootComment,
}
if node.Alias != nil {
newNode.Alias = clone(node.Alias)
}
if node.Content != nil {
newNode.Content = make([]*yaml.Node, len(node.Content))
for i, child := range node.Content {
newNode.Content[i] = clone(child)
}
}
return newNode
}
6 changes: 6 additions & 0 deletions pkg/overlay/testdata/openapi-overlayed.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -69,12 +69,14 @@ paths:
X-Optional-Header:
schema:
type: string
x-drop: true
/authenticate:
post:
operationId: authenticate
summary: Authenticate with the API by providing a username and password.
security: []
tags:
- dont-add-x-drop-false
- authentication
requestBody:
required: true
Expand Down Expand Up @@ -103,6 +105,7 @@ paths:
$ref: "#/components/responses/APIError"
default:
$ref: "#/components/responses/UnknownError"
x-drop: false
/drinks:
x-speakeasy-note:
"$ref": "./removeNote.yaml"
Expand Down Expand Up @@ -138,6 +141,7 @@ paths:
$ref: "#/components/responses/APIError"
default:
$ref: "#/components/responses/UnknownError"
x-drop: true
/order:
post:
operationId: createOrder
Expand Down Expand Up @@ -195,6 +199,7 @@ paths:
$ref: "#/components/responses/APIError"
default:
$ref: "#/components/responses/UnknownError"
x-drop: true
/webhooks/subscribe:
post:
operationId: subscribeToWebhooks
Expand Down Expand Up @@ -224,6 +229,7 @@ paths:
$ref: "#/components/responses/APIError"
default:
$ref: "#/components/responses/UnknownError"
x-drop: true
webhooks:
stockUpdate:
post:
Expand Down
1 change: 1 addition & 0 deletions pkg/overlay/testdata/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ paths:
summary: Authenticate with the API by providing a username and password.
security: []
tags:
- dont-add-x-drop-false
- authentication
requestBody:
required: true
Expand Down
9 changes: 8 additions & 1 deletion pkg/overlay/testdata/overlay.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,11 @@ actions:
servers:
- url: http://localhost:35123
description: The default server.
x-top-level-extension: true
- target: $.paths.*[[email protected]]
description: "add x-drop: true to all paths"
update:
x-drop: true
- target: $.paths.*[?length(@.tags[?(@ == "dont-add-x-drop-false")]) > 0]
description: "add x-drop: false to any operation which has the dont-add-x-drop-false tag"
update:
x-drop: false
Loading