diff --git a/registry/registry.go b/registry/registry.go index c3f6d67..073fcab 100644 --- a/registry/registry.go +++ b/registry/registry.go @@ -2,6 +2,8 @@ package registry import ( "context" + "errors" + "fmt" "github.com/hiroara/carbo/flow" ) @@ -20,9 +22,16 @@ func New() *Registry { return &Registry{factories: make(map[string]flow.Factory)} } +var ErrNoMatchingFlow = errors.New("no matching flow is found") + // Build a registered Flow selected with the passed name, and run it. func (r *Registry) Run(ctx context.Context, name string) error { - f, err := r.factories[name].Build() + fac, ok := r.factories[name] + if !ok { + return fmt.Errorf("%w with name \"%s\"", ErrNoMatchingFlow, name) + } + + f, err := fac.Build() if err != nil { return err } diff --git a/registry/registry_test.go b/registry/registry_test.go index 45f2a9d..4252295 100644 --- a/registry/registry_test.go +++ b/registry/registry_test.go @@ -17,24 +17,34 @@ import ( func TestRegistryRun(t *testing.T) { t.Parallel() - r := registry.New() + t.Run("NormalCase", func(t *testing.T) { + t.Parallel() - src := source.FromSlice([]string{"item1", "item2"}) + r := registry.New() - out := make([]string, 0) - sink := sink.ToSlice(&out) - conn := task.Connect(src.AsTask(), sink.AsTask(), 2) - called := false + src := source.FromSlice([]string{"item1", "item2"}) + out := make([]string, 0) + sink := sink.ToSlice(&out) + conn := task.Connect(src.AsTask(), sink.AsTask(), 2) + called := false - r.Register("flow1", flow.NewFactory(func() (*flow.Flow, error) { - called = true - return flow.FromTask(conn), nil - })) + r.Register("flow1", flow.NewFactory(func() (*flow.Flow, error) { + called = true + return flow.FromTask(conn), nil + })) - err := r.Run(context.Background(), "flow1") - require.NoError(t, err) + err := r.Run(context.Background(), "flow1") + require.NoError(t, err) - if assert.True(t, called) { - assert.Equal(t, []string{"item1", "item2"}, out) - } + if assert.True(t, called) { + assert.Equal(t, []string{"item1", "item2"}, out) + } + }) + + t.Run("NoMatchingFlowCase", func(t *testing.T) { + t.Parallel() + + r := registry.New() + assert.ErrorIs(t, r.Run(context.Background(), "unknown"), registry.ErrNoMatchingFlow) + }) }