summaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
Diffstat (limited to 'internal')
-rw-r--r--internal/resource/repository.go13
-rw-r--r--internal/resource/resource_test.go58
-rw-r--r--internal/resources/resources.go45
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
+}