Skip to content

Commit

Permalink
🔨 refactor: change internal errors to private ones
Browse files Browse the repository at this point in the history
  • Loading branch information
0xE8551CCB committed Oct 12, 2019
1 parent 5f05a79 commit 4db5a8b
Show file tree
Hide file tree
Showing 8 changed files with 66 additions and 45 deletions.
6 changes: 3 additions & 3 deletions chell.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ type Chell struct {
// New creates a new Chell instance with a worker pool waiting to be feed.
// It's highly recommended to call function `portal.Dump()` or
// `portal.DumpWithContext()` directly.
func New(opts ...Option) (*Chell, error) {
func New(opts ...option) (*Chell, error) {
chell := &Chell{
fieldAliasMapTagName: "json",
}
Expand All @@ -36,13 +36,13 @@ func New(opts ...Option) (*Chell, error) {

// Dump dumps src data to dst. You can filter fields with
// optional config `portal.Only` or `portal.Exclude`.
func Dump(dst, src interface{}, opts ...Option) error {
func Dump(dst, src interface{}, opts ...option) error {
return DumpWithContext(context.TODO(), dst, src, opts...)
}

// DumpWithContext dumps src data to dst with an extra context param.
// You can filter fields with optional config `portal.Only` or `portal.Exclude`.
func DumpWithContext(ctx context.Context, dst, src interface{}, opts ...Option) error {
func DumpWithContext(ctx context.Context, dst, src interface{}, opts ...option) error {
chell, err := New(opts...)
if err != nil {
return errors.WithStack(err)
Expand Down
59 changes: 40 additions & 19 deletions chell_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import (
"fmt"
"testing"

"github.com/pkg/errors"

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

Expand Down Expand Up @@ -34,9 +36,10 @@ func (u *UserModel) Notifications() (result []*NotificationModel) {
}

type TaskModel struct {
ID int
UserID int
Title string
ID int
UserID int
Title string
ErrDescription ErrField
}

func (t *TaskModel) User() *UserModel {
Expand All @@ -62,6 +65,7 @@ type TaskSchema struct {
Description string `json:"description,omitempty" portal:"meth:GetDescription"`
User *UserSchema `json:"user,omitempty" portal:"nested;async"`
SimpleUser *UserSchema `json:"simple_user,omitempty" portal:"async;nested;only:Name;attr:User"`
Unknown string `json:"unknown"`
}

func (ts *TaskSchema) GetDescription(model *TaskModel) string {
Expand All @@ -80,13 +84,13 @@ func TestDumpOneWithAllFields(t *testing.T) {
assert.Nil(t, err)

data, _ := json.Marshal(taskSchema)
assert.Equal(t, `{"id":"1","title":"Finish your jobs.","description":"Custom description","user":{"id":"1","name":"user:1","notifications":[{"id":"0","title":"title_0","content":"content_0"}],"another_notifications":[{"id":"0","title":"title_0","content":"content_0"}]},"simple_user":{"name":"user:1"}}`, string(data))
assert.Equal(t, `{"id":"1","title":"Finish your jobs.","description":"Custom description","user":{"id":"1","name":"user:1","notifications":[{"id":"0","title":"title_0","content":"content_0"}],"another_notifications":[{"id":"0","title":"title_0","content":"content_0"}]},"simple_user":{"name":"user:1"},"unknown":""}`, string(data))

var taskSchema1 *TaskSchema
err = Dump(&taskSchema1, &task)
assert.Nil(t, err)
data1, _ := json.Marshal(taskSchema)
assert.Equal(t, `{"id":"1","title":"Finish your jobs.","description":"Custom description","user":{"id":"1","name":"user:1","notifications":[{"id":"0","title":"title_0","content":"content_0"}],"another_notifications":[{"id":"0","title":"title_0","content":"content_0"}]},"simple_user":{"name":"user:1"}}`, string(data1))
assert.Equal(t, `{"id":"1","title":"Finish your jobs.","description":"Custom description","user":{"id":"1","name":"user:1","notifications":[{"id":"0","title":"title_0","content":"content_0"}],"another_notifications":[{"id":"0","title":"title_0","content":"content_0"}]},"simple_user":{"name":"user:1"},"unknown":""}`, string(data1))
}

func TestDumpOneFilterOnlyFields(t *testing.T) {
Expand All @@ -101,21 +105,21 @@ func TestDumpOneFilterOnlyFields(t *testing.T) {
assert.Nil(t, err)

data, _ := json.Marshal(taskSchema)
assert.Equal(t, `{"title":"Finish your jobs.","simple_user":{"name":"user:1"}}`, string(data))
assert.Equal(t, `{"title":"Finish your jobs.","simple_user":{"name":"user:1"},"unknown":""}`, string(data))

var taskSchema2 TaskSchema
err = Dump(&taskSchema2, &task, Only("ID", "User[ID,Notifications[ID],AnotherNotifications[Title]]", "SimpleUser"))
assert.Nil(t, err)

data, _ = json.Marshal(taskSchema2)
assert.Equal(t, `{"id":"1","user":{"id":"1","notifications":[{"id":"0"}],"another_notifications":[{"title":"title_0"}]},"simple_user":{"name":"user:1"}}`, string(data))
assert.Equal(t, `{"id":"1","user":{"id":"1","notifications":[{"id":"0"}],"another_notifications":[{"title":"title_0"}]},"simple_user":{"name":"user:1"},"unknown":""}`, string(data))

var taskSchema3 TaskSchema
err = Dump(&taskSchema3, &task, Only("title", "simple_user"), FieldAliasMapTagName("json"))
assert.Nil(t, err)

data, _ = json.Marshal(taskSchema)
assert.Equal(t, `{"title":"Finish your jobs.","simple_user":{"name":"user:1"}}`, string(data))
assert.Equal(t, `{"title":"Finish your jobs.","simple_user":{"name":"user:1"},"unknown":""}`, string(data))
}

func TestDumpOneExcludeFields(t *testing.T) {
Expand All @@ -130,7 +134,7 @@ func TestDumpOneExcludeFields(t *testing.T) {
assert.Nil(t, err)

data, _ := json.Marshal(taskSchema)
assert.Equal(t, `{"title":"Finish your jobs.","user":{"id":"1","notifications":[{"title":"title_0"}]}}`, string(data))
assert.Equal(t, `{"title":"Finish your jobs.","user":{"id":"1","notifications":[{"title":"title_0"}]},"unknown":""}`, string(data))
}

func TestDumpMany(t *testing.T) {
Expand All @@ -149,26 +153,43 @@ func TestDumpMany(t *testing.T) {
assert.Nil(t, err)

data, _ := json.Marshal(taskSchemas)
assert.Equal(t, `[{"id":"0","title":"Task #1","user":{"name":"user:100"}},{"id":"1","title":"Task #2","user":{"name":"user:101"}}]`, string(data))
assert.Equal(t, `[{"id":"0","title":"Task #1","user":{"name":"user:100"},"unknown":""},{"id":"1","title":"Task #2","user":{"name":"user:101"},"unknown":""}]`, string(data))

err = Dump(&taskSchemas, &tasks, Only("ID", "Title", "User[Name]"), DisableConcurrency())
assert.Nil(t, err)

data, _ = json.Marshal(taskSchemas)
assert.Equal(t, `[{"id":"0","title":"Task #1","user":{"name":"user:100"}},{"id":"1","title":"Task #2","user":{"name":"user:101"}}]`, string(data))
assert.Equal(t, `[{"id":"0","title":"Task #1","user":{"name":"user:100"},"unknown":""},{"id":"1","title":"Task #2","user":{"name":"user:101"},"unknown":""}]`, string(data))
}

type ErrField struct {
inner string
}

func (ef ErrField) Value() (interface{}, error) {
return "", errors.New("err field")
}

func TestDumpError(t *testing.T) {
task := TaskModel{
ID: 1,
UserID: 1,
Title: "Finish your jobs.",
ID: 1,
UserID: 1,
ErrDescription: ErrField{"err field"},
}

var taskSchema TaskSchema
err := Dump(&taskSchema, &task, Only("Title", "SimpleUser["))
dst := struct {
Title string
ID int
Desc string `portal:"attr:ErrDescription"`
}{}

err := Dump(&dst, &task, Only("Title", "Desc["))
assert.NotNil(t, err)
assert.Equal(t, errUnmatchedBrackets.Error(), err.Error())

err = Dump(&dst, &task, Only("Desc"))
assert.NotNil(t, err)
assert.Equal(t, ErrUnmatchedBrackets.Error(), err.Error())
assert.Equal(t, "err field", err.Error())
}

func TestChellDumpOk(t *testing.T) {
Expand All @@ -184,15 +205,15 @@ func TestChellDumpOk(t *testing.T) {
err := chell.Dump(&taskSchema, &task)
assert.Nil(t, err)
data, _ := json.Marshal(taskSchema)
assert.Equal(t, `{"title":"Finish your jobs.","simple_user":{"name":"user:1"}}`, string(data))
assert.Equal(t, `{"title":"Finish your jobs.","simple_user":{"name":"user:1"},"unknown":""}`, string(data))

chell, _ = New()
_ = chell.SetExcludeFields("Description", "ID", "User[Name,Notifications[ID,Content],AnotherNotifications], SimpleUser")
var taskSchema2 TaskSchema
err = chell.Dump(&taskSchema2, &task)
assert.Nil(t, err)
data, _ = json.Marshal(taskSchema2)
assert.Equal(t, `{"title":"Finish your jobs.","user":{"id":"1","notifications":[{"title":"title_0"}]}}`, string(data))
assert.Equal(t, `{"title":"Finish your jobs.","user":{"id":"1","notifications":[{"title":"title_0"}]},"unknown":""}`, string(data))
}

func TestChellBoundaryConditions(t *testing.T) {
Expand Down
12 changes: 6 additions & 6 deletions filter.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ import (
)

var (
ErrUnmatchedBrackets = errors.New("unmatched brackets")
ErrPrefixIsNotBracket = errors.New("filter string must starts with '['")
errUnmatchedBrackets = errors.New("unmatched brackets")
errPrefixIsNotBracket = errors.New("filter string must starts with '['")
)

var (
Expand Down Expand Up @@ -78,7 +78,7 @@ func parseFilterString(s string) (map[int][]*filterNode, error) {
}

if !strings.HasPrefix(s, "[") {
return nil, ErrPrefixIsNotBracket
return nil, errPrefixIsNotBracket
}

cachedResult, ok := cachedFilterResultMap.Load(s)
Expand Down Expand Up @@ -108,21 +108,21 @@ func checkBracketPairs(s []byte) error {
case ']':
x, err := stack.pop()
if err != nil {
return ErrUnmatchedBrackets
return errUnmatchedBrackets
}
if xc, ok := x.(byte); ok {
if xc == '[' {
continue
}
}
return ErrUnmatchedBrackets
return errUnmatchedBrackets
default:
continue
}
}

if stack.size() > 0 {
return ErrUnmatchedBrackets
return errUnmatchedBrackets
}

return nil
Expand Down
8 changes: 4 additions & 4 deletions filter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -137,15 +137,15 @@ func TestParseFilterString_BoundaryConditions(t *testing.T) {
asserter.Nil(node)

_, err = parseFilterString("A")
asserter.Equal(ErrPrefixIsNotBracket, err)
asserter.Equal(errPrefixIsNotBracket, err)
}

func Test_checkBracketPair(t *testing.T) {
asserter := assert.New(t)
asserter.Nil(checkBracketPairs([]byte("speaker")))
asserter.Nil(checkBracketPairs([]byte("speaker[]")))
asserter.Nil(checkBracketPairs([]byte("speaker[name,age[user[id]]]")))
asserter.Equal(ErrUnmatchedBrackets, checkBracketPairs([]byte("speaker[")))
asserter.Equal(ErrUnmatchedBrackets, checkBracketPairs([]byte("speaker]")))
asserter.Equal(ErrUnmatchedBrackets, checkBracketPairs([]byte("speaker[user[id]]]")))
asserter.Equal(errUnmatchedBrackets, checkBracketPairs([]byte("speaker[")))
asserter.Equal(errUnmatchedBrackets, checkBracketPairs([]byte("speaker]")))
asserter.Equal(errUnmatchedBrackets, checkBracketPairs([]byte("speaker[user[id]]]")))
}
10 changes: 5 additions & 5 deletions option.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@ package portal

import "github.com/pkg/errors"

type Option func(c *Chell) error
type option func(c *Chell) error

// Only specifies the fields to keep.
// Examples:
// ```
// c := New(Only("A")) // keep field A only
// c := New("A[B,C]") // // keep field B and C of the nested struct A
// ```
func Only(fields ...string) Option {
func Only(fields ...string) option {
return func(c *Chell) error {
filters, err := parseFilters(fields)
if err != nil {
Expand All @@ -27,7 +27,7 @@ func Only(fields ...string) Option {
// c := New(Exclude("A")) // exclude field A
// c := New(Exclude("A[B,C]")) // exclude field B and C of the nested struct A, but other fields of struct A are still selected.
// ```
func Exclude(fields ...string) Option {
func Exclude(fields ...string) option {
return func(c *Chell) error {
filters, err := parseFilters(fields)
if err != nil {
Expand All @@ -47,15 +47,15 @@ func Exclude(fields ...string) Option {
//
// // portal parses the json tag, and maps `id` -> `ID`.
// ```
func FieldAliasMapTagName(tag string) Option {
func FieldAliasMapTagName(tag string) option {
return func(c *Chell) error {
c.fieldAliasMapTagName = tag
return nil
}
}

// DisableConcurrency disables concurrency strategy.
func DisableConcurrency() Option {
func DisableConcurrency() option {
return func(c *Chell) error {
c.disableConcurrency = true
return nil
Expand Down
6 changes: 3 additions & 3 deletions pool.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ var (
)

var (
ErrFailedToInitWorkerPool = errors.New("failed to init portal worker pool")
errFailedToInitWorkerPool = errors.New("failed to init portal worker pool")
)

type (
Expand Down Expand Up @@ -85,7 +85,7 @@ func submitJobs(ctx context.Context, pf processFunc, payloads ...interface{}) (<
})
if err != nil {
cancel()
return nil, errors.WithStack(ErrFailedToInitWorkerPool)
return nil, errors.WithStack(errFailedToInitWorkerPool)
}
}

Expand Down Expand Up @@ -190,7 +190,7 @@ func init() {
processRequest,
)
if err != nil {
panic(ErrFailedToInitWorkerPool)
panic(errFailedToInitWorkerPool)
}

levelWorkerPoolMap.Store(0, p)
Expand Down
6 changes: 3 additions & 3 deletions stack.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package portal

import "github.com/pkg/errors"

var ErrStackIsEmpty = errors.New("stack is empty")
var errStackIsEmpty = errors.New("stack is empty")

type stack struct {
elements []interface{}
Expand All @@ -26,15 +26,15 @@ func (stack *stack) push(x interface{}) {

func (stack *stack) top() (interface{}, error) {
if stack.size() == 0 {
return nil, ErrStackIsEmpty
return nil, errStackIsEmpty
}

return stack.elements[stack.size()-1], nil
}

func (stack *stack) pop() (interface{}, error) {
if stack.size() == 0 {
return nil, ErrStackIsEmpty
return nil, errStackIsEmpty
}

x := stack.elements[stack.size()-1]
Expand Down
4 changes: 2 additions & 2 deletions stack_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ func TestStack(t *testing.T) {
asserter.Nil(err)

_, err = stack.pop()
asserter.Equal(ErrStackIsEmpty, err)
asserter.Equal(errStackIsEmpty, err)

_, err = stack.top()
asserter.Equal(ErrStackIsEmpty, err)
asserter.Equal(errStackIsEmpty, err)
}

0 comments on commit 4db5a8b

Please sign in to comment.