Skip to content

Commit

Permalink
refactor(context): Rename Chain to Pipe and add Chain (#153)
Browse files Browse the repository at this point in the history
* refactor(context): Rename `Chain` to `Pipe` and add `Chain`

Signed-off-by: Flc゛ <four_leaf_clover@foxmail.com>

* refactor(context): Rename `Chain` to `Pipe` and add `Chain`

Signed-off-by: Flc゛ <four_leaf_clover@foxmail.com>

---------

Signed-off-by: Flc゛ <four_leaf_clover@foxmail.com>
  • Loading branch information
flc1125 authored Mar 14, 2024
1 parent c5bd43f commit 76afc49
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 20 deletions.
16 changes: 15 additions & 1 deletion context/context.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ import (

type Provider func(ctx context.Context) (context.Context, error)

func Chain(ctx context.Context, providers ...Provider) (context.Context, error) {
// Pipe returns a Provider that chains the provided Providers.
func Pipe(ctx context.Context, providers ...Provider) (context.Context, error) {
var err error
for _, provider := range providers {
if provider != nil {
Expand All @@ -17,3 +18,16 @@ func Chain(ctx context.Context, providers ...Provider) (context.Context, error)
}
return ctx, nil
}

// Chain is a reverse Pipe.
func Chain(ctx context.Context, providers ...Provider) (context.Context, error) {
var err error
for i := len(providers) - 1; i >= 0; i-- {
if providers[i] != nil {
if ctx, err = providers[i](ctx); err != nil {
return ctx, err
}
}
}
return ctx, nil
}
68 changes: 49 additions & 19 deletions context/context_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,41 +8,71 @@ import (
"github.com/stretchr/testify/assert"
)

func TestContext(t *testing.T) {
type (
mockProviderStruct1 struct{}
mockProviderStruct2 struct{}
mockProviderStruct3 struct{}
)
type (
mockProviderStruct1 struct{}
mockProviderStruct2 struct{}
mockProviderStruct3 struct{}
)

var (
mockProvider1 = func(ctx context.Context) (context.Context, error) {
return context.WithValue(ctx, mockProviderStruct1{}, "mockProvider1"), nil
}
var result chan string

mockProvider2 = func(ctx context.Context) (context.Context, error) {
return context.WithValue(ctx, mockProviderStruct2{}, "mockProvider2"), nil
}
var (
mockProvider1 = func(ctx context.Context) (context.Context, error) {
result <- "mockProvider1"
return context.WithValue(ctx, mockProviderStruct1{}, "mockProvider1"), nil
}

mockProvider3 = func(ctx context.Context) (context.Context, error) {
return ctx, errors.New("mockProvider3")
}
)
mockProvider2 = func(ctx context.Context) (context.Context, error) {
result <- "mockProvider2"
return context.WithValue(ctx, mockProviderStruct2{}, "mockProvider2"), nil
}

ctx1, err1 := Chain(
mockProvider3 = func(ctx context.Context) (context.Context, error) {
result <- "mockProvider3"
return ctx, errors.New("mockProvider3")
}
)

func TestPipe(t *testing.T) {
result = make(chan string, 2)
ctx1, err1 := Pipe(
context.Background(),
mockProvider1, mockProvider2,
)
assert.NoError(t, err1)
assert.Equal(t, "mockProvider1", ctx1.Value(mockProviderStruct1{}))
assert.Equal(t, "mockProvider2", ctx1.Value(mockProviderStruct2{}))
assert.Equal(t, "mockProvider1", <-result)
assert.Equal(t, "mockProvider2", <-result)

ctx2, err2 := Chain(
ctx2, err2 := Pipe(
context.Background(),
mockProvider1, mockProvider3,
)
assert.Error(t, err2)
assert.NotNil(t, ctx2)
assert.Equal(t, "mockProvider1", ctx2.Value(mockProviderStruct1{}))
assert.Nil(t, ctx2.Value(mockProviderStruct3{}))
assert.Equal(t, "mockProvider1", <-result)
}

func TestChain(t *testing.T) {
result = make(chan string, 2)
ctx1, err1 := Chain(
context.Background(),
mockProvider1, mockProvider2,
)
assert.NoError(t, err1)
assert.Equal(t, "mockProvider1", ctx1.Value(mockProviderStruct1{}))
assert.Equal(t, "mockProvider2", ctx1.Value(mockProviderStruct2{}))
assert.Equal(t, "mockProvider2", <-result)
assert.Equal(t, "mockProvider1", <-result)

ctx2, err2 := Chain(
context.Background(),
mockProvider3, mockProvider1,
)
assert.Error(t, err2)
assert.Equal(t, "mockProvider1", ctx2.Value(mockProviderStruct1{}))
assert.Equal(t, "mockProvider1", <-result)
}

0 comments on commit 76afc49

Please sign in to comment.