diff options
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/resource/repository.go | 13 | ||||
| -rw-r--r-- | internal/resource/resource_test.go | 58 | ||||
| -rw-r--r-- | internal/resources/resources.go | 45 |
3 files changed, 107 insertions, 9 deletions
diff --git a/internal/resource/repository.go b/internal/resource/repository.go index 8affedc..a834b69 100644 --- a/internal/resource/repository.go +++ b/internal/resource/repository.go @@ -4,8 +4,6 @@ import ( "fmt" "log" "sync" - - "codeberg.org/snonux/gonf/internal/resource" ) var ( @@ -13,20 +11,21 @@ var ( once sync.Once ) -func initRepository() { +func getRepository() repository { once.Do(func() { repo = newRepository() }) + return repo } type repository struct { - registered map[string]resource.Resource + registered map[string]Resource mu *sync.Mutex } func newRepository() repository { return repository{ - registered: make(map[string]resource.Resource), + registered: make(map[string]Resource), mu: new(sync.Mutex), } } @@ -44,7 +43,3 @@ func (r repository) register(res Resource) error { return nil } - -// func (r repository)(res Resource) error { -// return nil -// } diff --git a/internal/resource/resource_test.go b/internal/resource/resource_test.go new file mode 100644 index 0000000..6f0665a --- /dev/null +++ b/internal/resource/resource_test.go @@ -0,0 +1,58 @@ +package resource + +import ( + "testing" +) + +func TestResourceID(t *testing.T) { + res := New("File", "/tmp/foo.txt") + expected := "File[/tmp/foo.txt]" + if res.ID() != expected { + t.Errorf("expected ID %s, got %s", expected, res.ID()) + } +} + +func TestResourceString(t *testing.T) { + res := New("File", "/tmp/foo.txt") + expected := "File[/tmp/foo.txt]" + if res.String() != expected { + t.Errorf("expected String %s, got %s", expected, res.String()) + } +} + +func TestNew(t *testing.T) { + type_ := "File" + name := "/tmp/foo.txt" + res := New(type_, name) + + if res.Type != type_ { + t.Errorf("expected type %s, got %s", type_, res.Type) + } + if res.Name != name { + t.Errorf("expected name %s, got %s", name, res.Name) + } + if res.dependsOn == nil { + t.Error("expected dependsOn map to be initialized, got nil") + } +} + +func TestRepositoryRegister(t *testing.T) { + repo := newRepository() + res := New("File", "/tmp/foo.txt") + + // First registration should succeed + if err := repo.register(res); err != nil { + t.Fatalf("expected successful registration, got error: %v", err) + } + + // Second registration of the same resource should fail + if err := repo.register(res); err == nil { + t.Error("expected error when registering the same resource twice, got nil") + } + + // Registration of a different resource should succeed + res2 := New("File", "/tmp/bar.txt") + if err := repo.register(res2); err != nil { + t.Fatalf("expected successful registration of different resource, got error: %v", err) + } +} diff --git a/internal/resources/resources.go b/internal/resources/resources.go new file mode 100644 index 0000000..495b26d --- /dev/null +++ b/internal/resources/resources.go @@ -0,0 +1,45 @@ +package resources + +import ( + "fmt" + "log" + "sync" + + "codeberg.org/snonux/gonf/internal/resource" +) + +var ( + registry resources + once sync.Once + mu sync.Mutex +) + +func Init() { + once.Do(func() { + registry = new() + }) +} + +type resources struct { + registered map[string]resource.Resource +} + +func new() resources { + return resources{ + registered: make(map[string]resource.Resource), + } +} + +func Register(res resource.Resource) error { + mu.Lock() + defer mu.Unlock() + + if _, exists := registry.registered[res.ID()]; exists { + return fmt.Errorf("resource %v already registered", res) + } + + registry.registered[res.ID()] = res + log.Printf("Registered resource %v\n", res) + + return nil +} |
