From 5bd09281ce3233bd33c10d8301625d9d9e4d72fc Mon Sep 17 00:00:00 2001 From: Mike Cohen Date: Fri, 23 Oct 2026 01:09:24 +1000 Subject: [PATCH] Implement field aliasing. --- ordereddict.go | 32 +++++++++++++++++++++++++++++++- ordereddict_test.go | 15 +++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/ordereddict.go b/ordereddict.go index b0701ae..01d6198 100644 --- a/ordereddict.go +++ b/ordereddict.go @@ -44,6 +44,11 @@ type Dict struct { // Used in Get() when we fail to match default_value interface{} + + // If set, this allows a field to be aliased: + // 1. The alias does not show in regular iterations Items() or Keys() + // 2. The Get() method will retried the aliased field when the alias is set. + aliases map[string]string } func NewDict() *Dict { @@ -52,6 +57,19 @@ func NewDict() *Dict { } } +func (self *Dict) AliasField(src, dest string) *Dict { + self.Lock() + defer self.Unlock() + + if self.aliases == nil { + self.aliases = make(map[string]string) + } + + self.aliases[self.getKey(src)] = self.getKey(dest) + + return self +} + func (self *Dict) DebugString() string { return fmt.Sprintf("Keys %v, len(store) %v, case_insensitive %v default_value %v\n", self.Keys(), self.Len(), self.IsCaseInsensitive(), self.GetDefault()) @@ -223,8 +241,20 @@ func (self *Dict) Get(key string) (interface{}, bool) { self.Lock() defer self.Unlock() - idx, pres := self.store[self.getKey(key)] + store_key := self.getKey(key) + idx, pres := self.store[store_key] if !pres { + // Is there an alias for this field? + if self.aliases != nil { + dest, pres := self.aliases[store_key] + if pres { + idx, pres := self.store[dest] + if pres { + return self.items[idx].Value, true + } + } + } + if self.default_value != nil { return self.default_value, false } diff --git a/ordereddict_test.go b/ordereddict_test.go index 17549a4..5a92f99 100644 --- a/ordereddict_test.go +++ b/ordereddict_test.go @@ -144,6 +144,21 @@ func TestDelete(t *testing.T) { assert.Equal(t, 2, test.Len()) } +func TestAliases(t *testing.T) { + test := NewDict(). + Set("A", 1). + Set("B", 2). + Set("C", 3) + test.AliasField("Foo", "A") + + assert.Equal(t, []string{"A", "B", "C"}, test.Keys()) + assert.Equal(t, 3, test.Len()) + + value, ok := test.Get("Foo") + assert.True(t, ok) + assert.Equal(t, 1, value) +} + func TestDefault(t *testing.T) { test := NewDict(). SetDefault("Default").