From 150b3f0f5d3ca30bbbfa2b23cf0e61c9e00f60ce Mon Sep 17 00:00:00 2001 From: Dmitry Fedotov Date: Fri, 17 Oct 2025 23:24:16 +0300 Subject: [PATCH] feat: add chain writer --- chain_processor.go => chain.go | 22 ++++++++++++++- chain_processor_test.go | 28 ------------------- chain_test.go | 49 ++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 29 deletions(-) rename chain_processor.go => chain.go (59%) delete mode 100644 chain_processor_test.go create mode 100644 chain_test.go diff --git a/chain_processor.go b/chain.go similarity index 59% rename from chain_processor.go rename to chain.go index 07a84b1..88967fc 100644 --- a/chain_processor.go +++ b/chain.go @@ -5,7 +5,7 @@ import "context" // Chain chains provided Processors. // When an error is returned by a Processor in chain, processing // stops and the error is retuned without running further stages. -func Chain(processors ...Processor) Processor { +func ChainProcessor(processors ...Processor) Processor { return func(ctx context.Context, in []string) ([]string, error) { var err error for _, p := range processors { @@ -21,3 +21,23 @@ func Chain(processors ...Processor) Processor { return in, nil } } + +type chainWriter struct { + w []Writer +} + +func (c *chainWriter) Write(in []string) error { + for _, w := range c.w { + if err := w.Write(in); err != nil { + return err + } + } + + return nil +} + +func ChainWriter(writers ...Writer) Writer { + return &chainWriter{ + w: writers, + } +} diff --git a/chain_processor_test.go b/chain_processor_test.go deleted file mode 100644 index 671b7ab..0000000 --- a/chain_processor_test.go +++ /dev/null @@ -1,28 +0,0 @@ -package script - -import ( - "context" - "slices" - "testing" -) - -func TestChain(t *testing.T) { - p := func(_ context.Context, in []string) ([]string, error) { - in[0] = in[0] + in[0] - return in, nil - } - - chain := Chain(p, p, p) - - in := []string{"a"} - want := []string{"aaaaaaaa"} - - res, err := chain(t.Context(), in) - if err != nil { - t.Fatal(err) - } - - if !slices.Equal(res, want) { - t.Fatalf("slices are not equal, have: %+v, want: %+v", res, want) - } -} diff --git a/chain_test.go b/chain_test.go new file mode 100644 index 0000000..8df3917 --- /dev/null +++ b/chain_test.go @@ -0,0 +1,49 @@ +package script + +import ( + "context" + "slices" + "testing" +) + +func TestChainProcessor(t *testing.T) { + p := func(_ context.Context, in []string) ([]string, error) { + in[0] = in[0] + in[0] + return in, nil + } + + chain := ChainProcessor(p, p, p) + + in := []string{"a"} + want := []string{"aaaaaaaa"} + + res, err := chain(t.Context(), in) + if err != nil { + t.Fatal(err) + } + + if !slices.Equal(res, want) { + t.Fatalf("slices are not equal, have: %+v, want: %+v", res, want) + } +} + +func TestChainWriter(t *testing.T) { + w1 := NewMemWriter() + w2 := NewMemWriter() + + w := ChainWriter(w1, w2) + + in := []string{"a"} + + if err := w.Write(in); err != nil { + t.Fatal(err) + } + + if !slices.Equal(w1.Output()[0], in) { + t.Fatalf("w1 slices are not equal, have: %+v, want: %+v", w1.Output()[0], in) + } + + if !slices.Equal(w2.Output()[0], in) { + t.Fatalf("w2 slices are not equal, have: %+v, want: %+v", w2.Output()[0], in) + } +}