Skip to content

Commit

Permalink
refactor(contexts): I'm not sure how to write it (#166)
Browse files Browse the repository at this point in the history
* refactor(provider): rename context to provider

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

* refactor(provider): split to contexts and provider

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

* refactor(provider): split to contexts and provider

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

---------

Signed-off-by: Flc゛ <four_leaf_clover@foxmail.com>
  • Loading branch information
flc1125 authored Mar 17, 2024
1 parent 7af8d79 commit 8bc25c9
Show file tree
Hide file tree
Showing 2 changed files with 111 additions and 0 deletions.
33 changes: 33 additions & 0 deletions contexts/contexts.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package contexts

import (
"context"
)

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

// Pipe returns a Provider that chains the provided Providers.
func Pipe(ctx context.Context, fns ...Func) (context.Context, error) {
var err error
for _, fn := range fns {
if fn != nil {
if ctx, err = fn(ctx); err != nil {
return ctx, err
}
}
}
return ctx, nil
}

// Chain is a reverse Pipe.
func Chain(ctx context.Context, fns ...Func) (context.Context, error) {
var err error
for i := len(fns) - 1; i >= 0; i-- {
if fns[i] != nil {
if ctx, err = fns[i](ctx); err != nil {
return ctx, err
}
}
}
return ctx, nil
}
78 changes: 78 additions & 0 deletions contexts/contexts_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package contexts

import (
"context"
"errors"
"testing"

"github.com/stretchr/testify/assert"
)

type (
mockProviderStruct1 struct{}
mockProviderStruct2 struct{}
mockProviderStruct3 struct{}
)

var result chan string

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

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

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 := 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 8bc25c9

Please sign in to comment.