Skip to content

Commit

Permalink
Resolver service. (#18)
Browse files Browse the repository at this point in the history
Signed-off-by: Pavel Patrin <[email protected]>
  • Loading branch information
pavelpatrin authored Apr 17, 2024
1 parent 8c12138 commit b1bbf95
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 0 deletions.
8 changes: 8 additions & 0 deletions container.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@ func New(factories ...*Factory) (result Container, err error) {
// Prepare services registry instance.
registry := &registry{events: events}

// Prepare service resolver instance.
resolver := &resolver{ctx: ctx, registry: registry}

// Prepare service container instance.
container := &container{
ctx: ctx,
Expand All @@ -70,6 +73,11 @@ func New(factories ...*Factory) (result Container, err error) {
return nil, fmt.Errorf("failed to register events service: %w", err)
}

// Register service resolver instance in the registry.
if err := container.registry.registerFactory(ctx, NewService[Resolver](resolver)); err != nil {
return nil, fmt.Errorf("failed to register service resolver: %w", err)
}

// Register provided factories in the registry.
for _, factory := range factories {
if err := container.registry.registerFactory(ctx, factory); err != nil {
Expand Down
31 changes: 31 additions & 0 deletions resolver.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package gontainer

import (
"context"
"fmt"
"reflect"
)

// Resolver defines service resolver interface.
type Resolver interface {
// Resolve returns specified dependency.
Resolve(any) error
}

// resolver implements resolver interface.
type resolver struct {
ctx context.Context
registry *registry
}

// Resolve returns specified dependency.
func (r *resolver) Resolve(varPtr any) error {
value := reflect.ValueOf(varPtr).Elem()
ins := []reflect.Type{value.Type()}
outs, err := r.registry.getFactoryInValues(r.ctx, ins)
if err != nil {
return fmt.Errorf("failed to get service: %s", err)
}
value.Set(outs[0])
return nil
}
35 changes: 35 additions & 0 deletions resolver_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package gontainer

import (
"testing"
"time"
)

// TestResolverService tests resolver service.
func TestResolverService(t *testing.T) {
container, err := New(
NewFactory(func() string { return "string" }),
NewFactory(func(resolver Resolver) {
var depExists string
equal(t, resolver.Resolve(&depExists), nil)
equal(t, depExists, "string")

var depNotExists int
equal(t, resolver.Resolve(&depNotExists) != nil, true)
equal(t, depNotExists, 0)
}),
)
equal(t, err, nil)
equal(t, container == nil, false)

// Start all factories in the container.
equal(t, container.Start(), nil)

// Let async service function launch.
time.Sleep(time.Millisecond)

// Close all factories in the container.
equal(t, container.Close(), nil)

<-container.Done()
}

0 comments on commit b1bbf95

Please sign in to comment.