Skip to content

Commit

Permalink
Do not throw error if alterfunc does not change the key
Browse files Browse the repository at this point in the history
  • Loading branch information
khushijain21 committed Nov 2, 2024
1 parent 038fdc1 commit 9d60cdd
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 7 deletions.
18 changes: 11 additions & 7 deletions mapstr/mapstr.go
Original file line number Diff line number Diff line change
Expand Up @@ -218,12 +218,16 @@ func (m M) AlterPath(path string, mode TraversalMode, alterFunc AlterFunc) (err
if newKey == "" {
return fmt.Errorf("replacement key for %q cannot be empty", key)
}
_, exists := level[newKey]
if exists {
return fmt.Errorf("replacement key %q already exists: %w", newKey, ErrKeyCollision)

// if altered key is equal to the original key, skip below delete/put func
if newKey != key {
_, exists := level[newKey]
if exists {
return fmt.Errorf("replacement key %q already exists: %w", newKey, ErrKeyCollision)
}
delete(level, key)
level[newKey] = val
}
delete(level, key)
level[newKey] = val

return nil
})
Expand Down Expand Up @@ -271,7 +275,7 @@ func (m M) Traverse(path string, mode TraversalMode, visitor TraversalVisitor) (

for i, segment := range segments {
if !found {
return ErrKeyNotFound
return fmt.Errorf("could not fetch value for key: %s, Error: %w ", path, ErrKeyNotFound)
}
found = false

Expand Down Expand Up @@ -316,7 +320,7 @@ func (m M) Traverse(path string, mode TraversalMode, visitor TraversalVisitor) (
}

if !found {
return ErrKeyNotFound
return fmt.Errorf("could not fetch value for key: %s, Error: %w", path, ErrKeyNotFound)
}

return nil
Expand Down
16 changes: 16 additions & 0 deletions mapstr/mapstr_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1264,6 +1264,22 @@ func TestAlterPath(t *testing.T) {
},
},
},
{
name: "alters keys on second level with case-insensitive matching",
from: "level1_field1.key",
mode: CaseInsensitiveMode,
alterFunc: lower,
m: M{
"level1_field1": M{
"Key": "value1",
},
},
exp: M{
"level1_field1": M{
"key": "value1",
},
},
},
{
name: "alters keys on all nested levels with case-insensitive matching",
from: "level1_field1.level2_field1.level3_field1",
Expand Down

0 comments on commit 9d60cdd

Please sign in to comment.