Skip to content

Commit

Permalink
refactor(bootstrap): Added Context (#141)
Browse files Browse the repository at this point in the history
* refactor(bootstrap): Added Context

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

* refactor(bootstrap): Added Context

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

---------

Signed-off-by: Flc゛ <four_leaf_clover@foxmail.com>
  • Loading branch information
flc1125 authored Mar 12, 2024
1 parent 3c99792 commit 18f206a
Show file tree
Hide file tree
Showing 7 changed files with 105 additions and 0 deletions.
58 changes: 58 additions & 0 deletions bootstrap/context.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package bootstrap

import (
"context"
)

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

type Context struct {
context.Context
providers []Provider
}

type ContextOption func(*Context)

func WithContext(ctx context.Context) ContextOption {
return func(c *Context) {
c.Context = ctx
}
}

func WithProviders(providers ...Provider) ContextOption {
return func(c *Context) {
c.Register(providers...)
}
}

func NewContext(opts ...ContextOption) *Context {
ctx := &Context{}

for _, opt := range opts {
opt(ctx)
}

ctx.init()

return ctx
}

func (c *Context) init() {
if c.Context == nil {
c.Context = context.Background()
}
}

func (c *Context) Register(providers ...Provider) {
c.providers = append(c.providers, providers...)
}

func (c *Context) Boot() (ctx context.Context, err error) {
ctx = c.Context
for _, provider := range c.providers {
if ctx, err = provider(ctx); err != nil {
return
}
}
return
}
47 changes: 47 additions & 0 deletions bootstrap/context_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package bootstrap

import (
"context"
"errors"
"testing"

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

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

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

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

mockProvider3 = func(ctx context.Context) (context.Context, error) {
return ctx, errors.New("mockProvider3")
}
)

func TestContext(t *testing.T) {
ctx1, err1 := NewContext(
WithProviders(mockProvider1, mockProvider2),
).Boot()
assert.NoError(t, err1)
assert.Equal(t, "mockProvider1", ctx1.Value(mockProviderStruct1{}))
assert.Equal(t, "mockProvider2", ctx1.Value(mockProviderStruct2{}))

ctx2, err2 := NewContext(
WithContext(context.Background()),
WithProviders(mockProvider1, mockProvider3),
).Boot()
assert.Error(t, err2)
assert.NotNil(t, ctx2)
assert.Equal(t, "mockProvider1", ctx2.Value(mockProviderStruct1{}))
assert.Nil(t, ctx2.Value(mockProviderStruct3{}))
}
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

0 comments on commit 18f206a

Please sign in to comment.