diff --git a/go.mod b/go.mod index bfa2981..fb58021 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,5 @@ module code.osinet.fr/fgm/izidic go 1.19 + +require github.com/google/go-cmp v0.5.9 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..62841cd --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= diff --git a/izidic.go b/izidic.go index 16a657f..7e17b1a 100644 --- a/izidic.go +++ b/izidic.go @@ -11,6 +11,7 @@ package izidic import ( "errors" "fmt" + "sort" "sync" ) @@ -37,6 +38,25 @@ func (dic *Container) Freeze() { dic.frozen = true } +// Names returns the names of all the parameters and instances defined on the container. +func (dic *Container) Names() map[string][]string { + dump := map[string][]string{ + "params": make([]string, 0, len(dic.parameters)), + "services": make([]string, 0, len(dic.serviceDefs)), + } + dic.RLock() + defer dic.RUnlock() + for k := range dic.parameters { + dump["params"] = append(dump["params"], k) + } + sort.Strings(dump["params"]) + for k := range dic.serviceDefs { + dump["services"] = append(dump["services"], k) + } + sort.Strings(dump["services"]) + return dump +} + // Register registers a service with the container. func (dic *Container) Register(name string, fn Service) { if dic.frozen { diff --git a/izidic_test.go b/izidic_test.go index fc34644..d2b7c5f 100644 --- a/izidic_test.go +++ b/izidic_test.go @@ -3,21 +3,25 @@ package izidic import ( "fmt" "testing" + + "github.com/google/go-cmp/cmp" ) -func TestContainer_Service(t *testing.T) { - const expected = "s1s2" - s1 := func(c *Container) (any, error) { +var ( + s1 = func(c *Container) (any, error) { return "s1", nil } - s2 := func(c *Container) (any, error) { + s2 = func(c *Container) (any, error) { s1, err := c.Service("s1") if err != nil { return nil, fmt.Errorf("could not get service s1: %w", err) } return s1.(string) + "s2", nil } +) +func TestContainer_Service(t *testing.T) { + const expected = "s1s2" dic := New() dic.Register("s1", s1) dic.Register("s2", s2) @@ -33,3 +37,24 @@ func TestContainer_Service(t *testing.T) { t.Fatalf("got %q but expected %q", actual, expected) } } + +func TestContainer_All(t *testing.T) { + var ( + vpt *string + vt string + ) + dic := New() + dic.Store("p1", vt) + dic.Store("p2", vpt) + dic.Register("s1", s1) + dic.Register("s2", s2) + + actual := dic.Names() + expected := map[string][]string{ + "params": {"p1", "p2"}, + "services": {"s1", "s2"}, + } + if !cmp.Equal(actual, expected) { + t.Logf("unequal results: %v", cmp.Diff(actual, expected)) + } +}