Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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
38 changes: 19 additions & 19 deletions epoch/flow_operations.go
Original file line number Diff line number Diff line change
Expand Up @@ -124,8 +124,8 @@ func (op *RequestRemoveField) Inverse() RequestToNextVersionOperation {
// RequestRenameField renames a field when request migrates from client to HEAD
// Use case: HEAD version renamed "name" to "full_name"
type RequestRenameField struct {
From string // Old field name (client uses this)
To string // New field name (HEAD uses this)
OlderVersionName string // Field name in older/client version
NewerVersionName string // Field name in newer/HEAD version
}

func (op *RequestRenameField) ApplyToRequest(node *ast.Node) error {
Expand All @@ -134,37 +134,37 @@ func (op *RequestRenameField) ApplyToRequest(node *ast.Node) error {
}

// Check if old field exists
if !node.Get(op.From).Exists() {
if !node.Get(op.OlderVersionName).Exists() {
return nil
}

// Get the value of the old field
value := node.Get(op.From)
value := node.Get(op.OlderVersionName)
if value == nil {
return nil
}

// Set new field with the value
if err := SetNodeField(node, op.To, value); err != nil {
return fmt.Errorf("failed to set field %s: %w", op.To, err)
if err := SetNodeField(node, op.NewerVersionName, value); err != nil {
return fmt.Errorf("failed to set field %s: %w", op.NewerVersionName, err)
}

// Delete old field
return DeleteNodeField(node, op.From)
return DeleteNodeField(node, op.OlderVersionName)
}

func (op *RequestRenameField) GetFieldMapping() map[string]string {
// When transforming error messages, map new field name back to old
return map[string]string{op.To: op.From}
return map[string]string{op.NewerVersionName: op.OlderVersionName}
}

// Inverse returns the opposite operation for schema generation
// RenameField (Client→HEAD: from→to) becomes RenameField (HEAD→Client: to→from)
// RenameField (Client→HEAD: older→newer) becomes RenameField (HEAD→Client: newer→older)
// This is a perfect inversion - completely reversible
func (op *RequestRenameField) Inverse() RequestToNextVersionOperation {
return &RequestRenameField{
From: op.To, // Swap directions
To: op.From,
OlderVersionName: op.NewerVersionName, // Swap directions
NewerVersionName: op.OlderVersionName,
}
}

Expand Down Expand Up @@ -275,8 +275,8 @@ func (op *ResponseRemoveFieldIfDefault) GetFieldMapping() map[string]string {
// ResponseRenameField renames a field when response migrates from HEAD to client
// Use case: HEAD renamed "name" to "full_name", rename back for old clients
type ResponseRenameField struct {
From string // New field name (HEAD uses this)
To string // Old field name (client expects this)
NewerVersionName string // Field name in newer/HEAD version
OlderVersionName string // Field name in older/client version
}

func (op *ResponseRenameField) ApplyToResponse(node *ast.Node) error {
Expand All @@ -285,28 +285,28 @@ func (op *ResponseRenameField) ApplyToResponse(node *ast.Node) error {
}

// Check if new field exists
if !node.Get(op.From).Exists() {
if !node.Get(op.NewerVersionName).Exists() {
return nil
}

// Get the value of the new field
value := node.Get(op.From)
value := node.Get(op.NewerVersionName)
if value == nil {
return nil
}

// Set old field with the value
if err := SetNodeField(node, op.To, value); err != nil {
return fmt.Errorf("failed to set field %s: %w", op.To, err)
if err := SetNodeField(node, op.OlderVersionName, value); err != nil {
return fmt.Errorf("failed to set field %s: %w", op.OlderVersionName, err)
}

// Delete new field
return DeleteNodeField(node, op.From)
return DeleteNodeField(node, op.NewerVersionName)
}

func (op *ResponseRenameField) GetFieldMapping() map[string]string {
// When transforming error messages, map new field name to old
return map[string]string{op.From: op.To}
return map[string]string{op.NewerVersionName: op.OlderVersionName}
}

// ResponseCustom applies a custom transformation function
Expand Down
4 changes: 2 additions & 2 deletions epoch/openapi/version_transformer.go
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,7 @@ func (vt *VersionTransformer) applyOperationToSchema(

case *epoch.ResponseRenameField:
// Rename a field in the response schema
vt.RenameFieldInSchema(schema, operation.From, operation.To)
vt.RenameFieldInSchema(schema, operation.NewerVersionName, operation.OlderVersionName)

case *epoch.RequestAddField:
// Add a field to the request schema
Expand All @@ -293,7 +293,7 @@ func (vt *VersionTransformer) applyOperationToSchema(

case *epoch.RequestRenameField:
// Rename a field in the request schema
vt.RenameFieldInSchema(schema, operation.From, operation.To)
vt.RenameFieldInSchema(schema, operation.OlderVersionName, operation.NewerVersionName)

case *epoch.ResponseRemoveFieldIfDefault:
// For schema generation, treat this as a regular remove
Expand Down
12 changes: 6 additions & 6 deletions epoch/version_change_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -279,11 +279,11 @@ func (b *requestToNextVersionBuilder) RemoveField(name string) *requestToNextVer
}

// RenameField renames a field when request migrates from client to HEAD
func (b *requestToNextVersionBuilder) RenameField(from, to string) *requestToNextVersionBuilder {
func (b *requestToNextVersionBuilder) RenameField(olderVersionName, newerVersionName string) *requestToNextVersionBuilder {
b.parent.requestToNextVersionOps = append(b.parent.requestToNextVersionOps,
&RequestRenameField{
From: from,
To: to,
OlderVersionName: olderVersionName,
NewerVersionName: newerVersionName,
})
return b
}
Expand Down Expand Up @@ -351,11 +351,11 @@ func (b *responseToPreviousVersionBuilder) RemoveFieldIfDefault(name string, def
}

// RenameField renames a field when response migrates from HEAD to client
func (b *responseToPreviousVersionBuilder) RenameField(from, to string) *responseToPreviousVersionBuilder {
func (b *responseToPreviousVersionBuilder) RenameField(newerVersionName, olderVersionName string) *responseToPreviousVersionBuilder {
b.parent.responseToPreviousVersionOps = append(b.parent.responseToPreviousVersionOps,
&ResponseRenameField{
From: from,
To: to,
NewerVersionName: newerVersionName,
OlderVersionName: olderVersionName,
})
return b
}
Expand Down