From d6e04824652f1a0b97c0b243eeb25ceefba0c98d Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Fri, 15 Nov 2024 17:38:24 -0600 Subject: [PATCH] enforce unique names Signed-off-by: Jeff Carr --- example/main.go | 28 ++++++++++++++++++++++++---- packages.go | 25 +++++++++++++++++++++++-- 2 files changed, 47 insertions(+), 6 deletions(-) diff --git a/example/main.go b/example/main.go index 8187d57..923f27c 100644 --- a/example/main.go +++ b/example/main.go @@ -4,6 +4,7 @@ import ( "fmt" "go.wit.com/lib/protobuf/zoopb" + "go.wit.com/log" ) func main() { @@ -11,10 +12,29 @@ func main() { all = new(zoopb.Packages) // r = zoopb.LoadJSON("go.wit.com/lib/protobuf/zoopb") - newP := new(zoopb.Package) - newP.Name = "bash" - newP.Version = "5.2.21" - all.Append(newP) + new1 := new(zoopb.Package) + new1.Name = "bash" + new1.Version = "5.2.21" + if all.Append(new1) { + log.Info("added", new1.Name, "ok") + } else { + log.Info("added", new1.Name, "failed") + } + + new2 := new(zoopb.Package) + new2.Name = "go-clone" + new2.Version = "0.6.8" // good version of the macos + if all.Append(new2) { + log.Info("added", new2.Name, "ok") + } else { + log.Info("added", new2.Name, "failed") + } + + if all.Append(new2) { + log.Info("added", new2.Name, "ok (this is bad)") + } else { + log.Info("added", new2.Name, "failed (but ok)") + } fmt.Println("packages are:", len(all.Packages)) } diff --git a/packages.go b/packages.go index 1436c45..aeee7ea 100644 --- a/packages.go +++ b/packages.go @@ -70,12 +70,33 @@ func (r *Packages) SortByName() *PackageIterator { return iterator } -// should this be a pointer? what really happens here? -func (r *Packages) Append(newP *Package) { +// enforces no duplicate package names +func (r *Packages) Append(newP *Package) bool { lock.Lock() defer lock.Unlock() + for _, p := range r.Packages { + if p.Name == newP.Name { + return false + } + } + r.Packages = append(r.Packages, newP) + return true +} + +// find a package by name +func (r *Packages) FindByName(name string) *Package { + lock.Lock() + defer lock.Unlock() + + for _, p := range r.Packages { + if p.Name == name { + return p + } + } + + return nil } type ByName []*Package