add error code for components

This commit is contained in:
John Guo 2021-07-20 23:02:02 +08:00
parent f72d991c36
commit 0ddacdd7e2
88 changed files with 434 additions and 263 deletions

View File

@ -123,7 +123,7 @@ func (a *Array) Set(index int, value interface{}) error {
a.mu.Lock()
defer a.mu.Unlock()
if index < 0 || index >= len(a.array) {
return gerror.Newf("index %d out of array range %d", index, len(a.array))
return gerror.NewCodef(gerror.CodeInvalidParameter, "index %d out of array range %d", index, len(a.array))
}
a.array[index] = value
return nil
@ -176,7 +176,7 @@ func (a *Array) InsertBefore(index int, value interface{}) error {
a.mu.Lock()
defer a.mu.Unlock()
if index < 0 || index >= len(a.array) {
return gerror.Newf("index %d out of array range %d", index, len(a.array))
return gerror.NewCodef(gerror.CodeInvalidParameter, "index %d out of array range %d", index, len(a.array))
}
rear := append([]interface{}{}, a.array[index:]...)
a.array = append(a.array[0:index], value)
@ -189,7 +189,7 @@ func (a *Array) InsertAfter(index int, value interface{}) error {
a.mu.Lock()
defer a.mu.Unlock()
if index < 0 || index >= len(a.array) {
return gerror.Newf("index %d out of array range %d", index, len(a.array))
return gerror.NewCodef(gerror.CodeInvalidParameter, "index %d out of array range %d", index, len(a.array))
}
rear := append([]interface{}{}, a.array[index+1:]...)
a.array = append(a.array[0:index+1], value)
@ -545,7 +545,7 @@ func (a *Array) Fill(startIndex int, num int, value interface{}) error {
a.mu.Lock()
defer a.mu.Unlock()
if startIndex < 0 || startIndex > len(a.array) {
return gerror.Newf("index %d out of array range %d", startIndex, len(a.array))
return gerror.NewCodef(gerror.CodeInvalidParameter, "index %d out of array range %d", startIndex, len(a.array))
}
for i := startIndex; i < startIndex+num; i++ {
if i > len(a.array)-1 {

View File

@ -104,7 +104,7 @@ func (a *IntArray) Set(index int, value int) error {
a.mu.Lock()
defer a.mu.Unlock()
if index < 0 || index >= len(a.array) {
return gerror.Newf("index %d out of array range %d", index, len(a.array))
return gerror.NewCodef(gerror.CodeInvalidParameter, "index %d out of array range %d", index, len(a.array))
}
a.array[index] = value
return nil
@ -175,7 +175,7 @@ func (a *IntArray) InsertBefore(index int, value int) error {
a.mu.Lock()
defer a.mu.Unlock()
if index < 0 || index >= len(a.array) {
return gerror.Newf("index %d out of array range %d", index, len(a.array))
return gerror.NewCodef(gerror.CodeInvalidParameter, "index %d out of array range %d", index, len(a.array))
}
rear := append([]int{}, a.array[index:]...)
a.array = append(a.array[0:index], value)
@ -188,7 +188,7 @@ func (a *IntArray) InsertAfter(index int, value int) error {
a.mu.Lock()
defer a.mu.Unlock()
if index < 0 || index >= len(a.array) {
return gerror.Newf("index %d out of array range %d", index, len(a.array))
return gerror.NewCodef(gerror.CodeInvalidParameter, "index %d out of array range %d", index, len(a.array))
}
rear := append([]int{}, a.array[index+1:]...)
a.array = append(a.array[0:index+1], value)
@ -559,7 +559,7 @@ func (a *IntArray) Fill(startIndex int, num int, value int) error {
a.mu.Lock()
defer a.mu.Unlock()
if startIndex < 0 || startIndex > len(a.array) {
return gerror.Newf("index %d out of array range %d", startIndex, len(a.array))
return gerror.NewCodef(gerror.CodeInvalidParameter, "index %d out of array range %d", startIndex, len(a.array))
}
for i := startIndex; i < startIndex+num; i++ {
if i > len(a.array)-1 {

View File

@ -90,7 +90,7 @@ func (a *StrArray) Set(index int, value string) error {
a.mu.Lock()
defer a.mu.Unlock()
if index < 0 || index >= len(a.array) {
return gerror.Newf("index %d out of array range %d", index, len(a.array))
return gerror.NewCodef(gerror.CodeInvalidParameter, "index %d out of array range %d", index, len(a.array))
}
a.array[index] = value
return nil
@ -162,7 +162,7 @@ func (a *StrArray) InsertBefore(index int, value string) error {
a.mu.Lock()
defer a.mu.Unlock()
if index < 0 || index >= len(a.array) {
return gerror.Newf("index %d out of array range %d", index, len(a.array))
return gerror.NewCodef(gerror.CodeInvalidParameter, "index %d out of array range %d", index, len(a.array))
}
rear := append([]string{}, a.array[index:]...)
a.array = append(a.array[0:index], value)
@ -175,7 +175,7 @@ func (a *StrArray) InsertAfter(index int, value string) error {
a.mu.Lock()
defer a.mu.Unlock()
if index < 0 || index >= len(a.array) {
return gerror.Newf("index %d out of array range %d", index, len(a.array))
return gerror.NewCodef(gerror.CodeInvalidParameter, "index %d out of array range %d", index, len(a.array))
}
rear := append([]string{}, a.array[index+1:]...)
a.array = append(a.array[0:index+1], value)
@ -562,7 +562,7 @@ func (a *StrArray) Fill(startIndex int, num int, value string) error {
a.mu.Lock()
defer a.mu.Unlock()
if startIndex < 0 || startIndex > len(a.array) {
return gerror.Newf("index %d out of array range %d", startIndex, len(a.array))
return gerror.NewCodef(gerror.CodeInvalidParameter, "index %d out of array range %d", startIndex, len(a.array))
}
for i := startIndex; i < startIndex+num; i++ {
if i > len(a.array)-1 {

View File

@ -66,7 +66,7 @@ func New(ttl time.Duration, newFunc NewFunc, expireFunc ...ExpireFunc) *Pool {
// Put puts an item to pool.
func (p *Pool) Put(value interface{}) error {
if p.closed.Val() {
return gerror.New("pool is closed")
return gerror.NewCode(gerror.CodeInvalidOperation, "pool is closed")
}
item := &poolItem{
value: value,
@ -117,7 +117,7 @@ func (p *Pool) Get() (interface{}, error) {
if p.NewFunc != nil {
return p.NewFunc()
}
return nil, gerror.New("pool is empty")
return nil, gerror.NewCode(gerror.CodeInvalidOperation, "pool is empty")
}
// Size returns the count of available items of pool.

View File

@ -63,7 +63,7 @@ func DecryptCBC(cipherText []byte, key []byte, iv ...[]byte) ([]byte, error) {
}
blockSize := block.BlockSize()
if len(cipherText) < blockSize {
return nil, gerror.New("cipherText too short")
return nil, gerror.NewCode(gerror.CodeInvalidParameter, "cipherText too short")
}
ivValue := ([]byte)(nil)
if len(iv) > 0 {
@ -72,7 +72,7 @@ func DecryptCBC(cipherText []byte, key []byte, iv ...[]byte) ([]byte, error) {
ivValue = []byte(IVDefaultValue)
}
if len(cipherText)%blockSize != 0 {
return nil, gerror.New("cipherText is not a multiple of the block size")
return nil, gerror.NewCode(gerror.CodeInvalidParameter, "cipherText is not a multiple of the block size")
}
blockModel := cipher.NewCBCDecrypter(block, ivValue)
plainText := make([]byte, len(cipherText))
@ -93,22 +93,22 @@ func PKCS5Padding(src []byte, blockSize int) []byte {
func PKCS5UnPadding(src []byte, blockSize int) ([]byte, error) {
length := len(src)
if blockSize <= 0 {
return nil, gerror.New("invalid blocklen")
return nil, gerror.NewCode(gerror.CodeInvalidParameter, "invalid blocklen")
}
if length%blockSize != 0 || length == 0 {
return nil, gerror.New("invalid data len")
return nil, gerror.NewCode(gerror.CodeInvalidParameter, "invalid data len")
}
unpadding := int(src[length-1])
if unpadding > blockSize || unpadding == 0 {
return nil, gerror.New("invalid padding")
return nil, gerror.NewCode(gerror.CodeInvalidParameter, "invalid padding")
}
padding := src[length-unpadding:]
for i := 0; i < unpadding; i++ {
if padding[i] != byte(unpadding) {
return nil, gerror.New("invalid padding")
return nil, gerror.NewCode(gerror.CodeInvalidParameter, "invalid padding")
}
}
@ -146,7 +146,7 @@ func DecryptCFB(cipherText []byte, key []byte, unPadding int, iv ...[]byte) ([]b
return nil, err
}
if len(cipherText) < aes.BlockSize {
return nil, gerror.New("cipherText too short")
return nil, gerror.NewCode(gerror.CodeInvalidParameter, "cipherText too short")
}
ivValue := ([]byte)(nil)
if len(iv) > 0 {

View File

@ -66,7 +66,7 @@ func DecryptECB(cipherText []byte, key []byte, padding int) ([]byte, error) {
// The length of the <key> should be either 16 or 24 bytes.
func EncryptECBTriple(plainText []byte, key []byte, padding int) ([]byte, error) {
if len(key) != 16 && len(key) != 24 {
return nil, gerror.New("key length error")
return nil, gerror.NewCode(gerror.CodeInvalidParameter, "key length error")
}
text, err := Padding(plainText, padding)
@ -100,7 +100,7 @@ func EncryptECBTriple(plainText []byte, key []byte, padding int) ([]byte, error)
// The length of the <key> should be either 16 or 24 bytes.
func DecryptECBTriple(cipherText []byte, key []byte, padding int) ([]byte, error) {
if len(key) != 16 && len(key) != 24 {
return nil, gerror.New("key length error")
return nil, gerror.NewCode(gerror.CodeInvalidParameter, "key length error")
}
var newKey []byte
@ -138,7 +138,7 @@ func EncryptCBC(plainText []byte, key []byte, iv []byte, padding int) ([]byte, e
}
if len(iv) != block.BlockSize() {
return nil, gerror.New("iv length invalid")
return nil, gerror.NewCode(gerror.CodeInvalidParameter, "iv length invalid")
}
text, err := Padding(plainText, padding)
@ -161,7 +161,7 @@ func DecryptCBC(cipherText []byte, key []byte, iv []byte, padding int) ([]byte,
}
if len(iv) != block.BlockSize() {
return nil, gerror.New("iv length invalid")
return nil, gerror.NewCode(gerror.CodeInvalidParameter, "iv length invalid")
}
text := make([]byte, len(cipherText))
@ -179,7 +179,7 @@ func DecryptCBC(cipherText []byte, key []byte, iv []byte, padding int) ([]byte,
// EncryptCBCTriple encrypts <plainText> using TripleDES and CBC mode.
func EncryptCBCTriple(plainText []byte, key []byte, iv []byte, padding int) ([]byte, error) {
if len(key) != 16 && len(key) != 24 {
return nil, gerror.New("key length invalid")
return nil, gerror.NewCode(gerror.CodeInvalidParameter, "key length invalid")
}
var newKey []byte
@ -196,7 +196,7 @@ func EncryptCBCTriple(plainText []byte, key []byte, iv []byte, padding int) ([]b
}
if len(iv) != block.BlockSize() {
return nil, gerror.New("iv length invalid")
return nil, gerror.NewCode(gerror.CodeInvalidParameter, "iv length invalid")
}
text, err := Padding(plainText, padding)
@ -214,7 +214,7 @@ func EncryptCBCTriple(plainText []byte, key []byte, iv []byte, padding int) ([]b
// DecryptCBCTriple decrypts <cipherText> using TripleDES and CBC mode.
func DecryptCBCTriple(cipherText []byte, key []byte, iv []byte, padding int) ([]byte, error) {
if len(key) != 16 && len(key) != 24 {
return nil, gerror.New("key length invalid")
return nil, gerror.NewCode(gerror.CodeInvalidParameter, "key length invalid")
}
var newKey []byte
@ -231,7 +231,7 @@ func DecryptCBCTriple(cipherText []byte, key []byte, iv []byte, padding int) ([]
}
if len(iv) != block.BlockSize() {
return nil, gerror.New("iv length invalid")
return nil, gerror.NewCode(gerror.CodeInvalidParameter, "iv length invalid")
}
text := make([]byte, len(cipherText))
@ -262,12 +262,12 @@ func Padding(text []byte, padding int) ([]byte, error) {
switch padding {
case NOPADDING:
if len(text)%8 != 0 {
return nil, gerror.New("text length invalid")
return nil, gerror.NewCode(gerror.CodeInvalidParameter, "text length invalid")
}
case PKCS5PADDING:
return PaddingPKCS5(text, 8), nil
default:
return nil, gerror.New("padding type error")
return nil, gerror.NewCode(gerror.CodeInvalidParameter, "padding type error")
}
return text, nil
@ -277,12 +277,12 @@ func UnPadding(text []byte, padding int) ([]byte, error) {
switch padding {
case NOPADDING:
if len(text)%8 != 0 {
return nil, gerror.New("text length invalid")
return nil, gerror.NewCode(gerror.CodeInvalidParameter, "text length invalid")
}
case PKCS5PADDING:
return UnPaddingPKCS5(text), nil
default:
return nil, gerror.New("padding type error")
return nil, gerror.NewCode(gerror.CodeInvalidParameter, "padding type error")
}
return text, nil
}

View File

@ -10,7 +10,6 @@ package gdb
import (
"context"
"database/sql"
"fmt"
"time"
"github.com/gogf/gf/errors/gerror"
@ -333,7 +332,10 @@ func New(group ...string) (db DB, err error) {
defer configs.RUnlock()
if len(configs.config) < 1 {
return nil, gerror.New("database configuration is empty, please set the database configuration before using")
return nil, gerror.NewCode(
gerror.CodeInvalidConfiguration,
"database configuration is empty, please set the database configuration before using",
)
}
if _, ok := configs.config[groupName]; ok {
if node, err := getConfigNodeByGroup(groupName, true); err == nil {
@ -352,7 +354,8 @@ func New(group ...string) (db DB, err error) {
}
return c.db, nil
} else {
return nil, gerror.Newf(
return nil, gerror.NewCodef(
gerror.CodeInvalidConfiguration,
`cannot find database driver for specified database type "%s", did you misspell type name "%s" or forget importing the database driver?`,
node.Type, node.Type,
)
@ -361,7 +364,8 @@ func New(group ...string) (db DB, err error) {
return nil, err
}
} else {
return nil, gerror.Newf(
return nil, gerror.NewCodef(
gerror.CodeInvalidConfiguration,
`database configuration node "%s" is not found, did you misspell group name "%s" or miss the database configuration?`,
groupName, groupName,
)
@ -404,7 +408,7 @@ func getConfigNodeByGroup(group string, master bool) (*ConfigNode, error) {
}
}
if len(masterList) < 1 {
return nil, gerror.New("at least one master node configuration's need to make sense")
return nil, gerror.NewCode(gerror.CodeInvalidConfiguration, "at least one master node configuration's need to make sense")
}
if len(slaveList) < 1 {
slaveList = masterList
@ -415,7 +419,7 @@ func getConfigNodeByGroup(group string, master bool) (*ConfigNode, error) {
return getConfigNodeByWeight(slaveList), nil
}
} else {
return nil, gerror.New(fmt.Sprintf("empty database configuration for item name '%s'", group))
return nil, gerror.NewCodef(gerror.CodeInvalidConfiguration, "empty database configuration for item name '%s'", group)
}
}

View File

@ -89,7 +89,7 @@ func (c *Core) GetCtxTimeout(timeoutType int, ctx context.Context) (context.Cont
return context.WithTimeout(ctx, c.db.GetConfig().PrepareTimeout)
}
default:
panic(gerror.Newf("invalid context timeout type: %d", timeoutType))
panic(gerror.NewCodef(gerror.CodeInvalidParameter, "invalid context timeout type: %d", timeoutType))
}
return ctx, func() {}
}
@ -553,7 +553,7 @@ func (c *Core) DoUpdate(ctx context.Context, link Link, table string, data inter
updates = gconv.String(data)
}
if len(updates) == 0 {
return nil, gerror.New("data cannot be empty")
return nil, gerror.NewCode(gerror.CodeMissingParameter, "data cannot be empty")
}
if len(params) > 0 {
args = append(params, args...)

View File

@ -136,7 +136,7 @@ func (c *Core) DoExec(ctx context.Context, link Link, sql string, args ...interf
func (c *Core) DoCommit(ctx context.Context, link Link, sql string, args []interface{}) (newSql string, newArgs []interface{}, err error) {
if c.db.GetConfig().CtxStrict {
if v := ctx.Value(ctxStrictKeyName); v == nil {
return sql, args, gerror.New(ctxStrictErrorStr)
return sql, args, gerror.NewCode(gerror.CodeMissingParameter, ctxStrictErrorStr)
}
}
return sql, args, nil
@ -181,7 +181,7 @@ func (c *Core) DoPrepare(ctx context.Context, link Link, sql string) (*Stmt, err
if c.db.GetConfig().CtxStrict {
if v := ctx.Value(ctxStrictKeyName); v == nil {
return nil, gerror.New(ctxStrictErrorStr)
return nil, gerror.NewCode(gerror.CodeMissingParameter, ctxStrictErrorStr)
}
}

View File

@ -214,7 +214,7 @@ func (d *DriverMssql) TableFields(ctx context.Context, table string, schema ...s
charL, charR := d.GetChars()
table = gstr.Trim(table, charL+charR)
if gstr.Contains(table, " ") {
return nil, gerror.New("function TableFields supports only single table operations")
return nil, gerror.NewCode(gerror.CodeInvalidParameter, "function TableFields supports only single table operations")
}
useSchema := d.db.GetSchema()
if len(schema) > 0 && schema[0] != "" {
@ -292,10 +292,10 @@ ORDER BY a.id,a.colorder`,
func (d *DriverMssql) DoInsert(ctx context.Context, link Link, table string, list List, option DoInsertOption) (result sql.Result, err error) {
switch option.InsertOption {
case insertOptionSave:
return nil, gerror.New(`Save operation is not supported by mssql driver`)
return nil, gerror.NewCode(gerror.CodeNotSupported, `Save operation is not supported by mssql driver`)
case insertOptionReplace:
return nil, gerror.New(`Replace operation is not supported by mssql driver`)
return nil, gerror.NewCode(gerror.CodeNotSupported, `Replace operation is not supported by mssql driver`)
default:
return d.Core.DoInsert(ctx, link, table, list, option)

View File

@ -121,7 +121,7 @@ func (d *DriverMysql) TableFields(ctx context.Context, table string, schema ...s
charL, charR := d.GetChars()
table = gstr.Trim(table, charL+charR)
if gstr.Contains(table, " ") {
return nil, gerror.New("function TableFields supports only single table operations")
return nil, gerror.NewCode(gerror.CodeInvalidParameter, "function TableFields supports only single table operations")
}
useSchema := d.schema.Val()
if len(schema) > 0 && schema[0] != "" {

View File

@ -186,7 +186,7 @@ func (d *DriverOracle) TableFields(ctx context.Context, table string, schema ...
charL, charR := d.GetChars()
table = gstr.Trim(table, charL+charR)
if gstr.Contains(table, " ") {
return nil, gerror.New("function TableFields supports only single table operations")
return nil, gerror.NewCode(gerror.CodeInvalidParameter, "function TableFields supports only single table operations")
}
useSchema := d.db.GetSchema()
if len(schema) > 0 && schema[0] != "" {
@ -278,10 +278,10 @@ func (d *DriverOracle) getTableUniqueIndex(table string) (fields map[string]map[
func (d *DriverOracle) DoInsert(ctx context.Context, link Link, table string, list List, option DoInsertOption) (result sql.Result, err error) {
switch option.InsertOption {
case insertOptionSave:
return nil, gerror.New(`Save operation is not supported by mssql driver`)
return nil, gerror.NewCode(gerror.CodeNotSupported, `Save operation is not supported by mssql driver`)
case insertOptionReplace:
return nil, gerror.New(`Replace operation is not supported by mssql driver`)
return nil, gerror.NewCode(gerror.CodeNotSupported, `Replace operation is not supported by mssql driver`)
}
var (

View File

@ -126,7 +126,7 @@ func (d *DriverPgsql) TableFields(ctx context.Context, table string, schema ...s
charL, charR := d.GetChars()
table = gstr.Trim(table, charL+charR)
if gstr.Contains(table, " ") {
return nil, gerror.New("function TableFields supports only single table operations")
return nil, gerror.NewCode(gerror.CodeInvalidParameter, "function TableFields supports only single table operations")
}
table, _ = gregex.ReplaceString("\"", "", table)
useSchema := d.db.GetSchema()
@ -190,10 +190,10 @@ ORDER BY a.attnum`,
func (d *DriverPgsql) DoInsert(ctx context.Context, link Link, table string, list List, option DoInsertOption) (result sql.Result, err error) {
switch option.InsertOption {
case insertOptionSave:
return nil, gerror.New(`Save operation is not supported by pgsql driver`)
return nil, gerror.NewCode(gerror.CodeNotSupported, `Save operation is not supported by pgsql driver`)
case insertOptionReplace:
return nil, gerror.New(`Replace operation is not supported by pgsql driver`)
return nil, gerror.NewCode(gerror.CodeNotSupported, `Replace operation is not supported by pgsql driver`)
default:
return d.Core.DoInsert(ctx, link, table, list, option)

View File

@ -99,7 +99,7 @@ func (d *DriverSqlite) TableFields(ctx context.Context, table string, schema ...
charL, charR := d.GetChars()
table = gstr.Trim(table, charL+charR)
if gstr.Contains(table, " ") {
return nil, gerror.New("function TableFields supports only single table operations")
return nil, gerror.NewCode(gerror.CodeInvalidParameter, "function TableFields supports only single table operations")
}
useSchema := d.db.GetSchema()
if len(schema) > 0 && schema[0] != "" {
@ -141,10 +141,10 @@ func (d *DriverSqlite) TableFields(ctx context.Context, table string, schema ...
func (d *DriverSqlite) DoInsert(ctx context.Context, link Link, table string, list List, option DoInsertOption) (result sql.Result, err error) {
switch option.InsertOption {
case insertOptionSave:
return nil, gerror.New(`Save operation is not supported by sqlite driver`)
return nil, gerror.NewCode(gerror.CodeNotSupported, `Save operation is not supported by sqlite driver`)
case insertOptionReplace:
return nil, gerror.New(`Replace operation is not supported by sqlite driver`)
return nil, gerror.NewCode(gerror.CodeNotSupported, `Replace operation is not supported by sqlite driver`)
default:
return d.Core.DoInsert(ctx, link, table, list, option)

View File

@ -805,7 +805,7 @@ func handleArguments(sql string, args []interface{}) (newSql string, newArgs []i
// formatError customizes and returns the SQL error.
func formatError(err error, sql string, args ...interface{}) error {
if err != nil && err != ErrNoRows {
return gerror.New(fmt.Sprintf("%s, %s\n", err.Error(), FormatSqlWithArgs(sql, args)))
return gerror.NewCodef(gerror.CodeDbOperationError, "%s, %s\n", err.Error(), FormatSqlWithArgs(sql, args))
}
return err
}

View File

@ -44,7 +44,7 @@ func (m *Model) Delete(where ...interface{}) (result sql.Result, err error) {
}
conditionStr := conditionWhere + conditionExtra
if !gstr.ContainsI(conditionStr, " WHERE ") {
return nil, gerror.New("there should be WHERE condition statement for DELETE operation")
return nil, gerror.NewCode(gerror.CodeMissingParameter, "there should be WHERE condition statement for DELETE operation")
}
return m.db.DoDelete(m.GetCtx(), m.getLink(true), m.tables, conditionStr, conditionArgs...)
}

View File

@ -8,7 +8,6 @@ package gdb
import (
"database/sql"
"fmt"
"github.com/gogf/gf/container/gset"
"reflect"
@ -211,7 +210,7 @@ func (m *Model) doInsertWithOption(insertOption int) (result sql.Result, err err
}
}()
if m.data == nil {
return nil, gerror.New("inserting into table with empty data")
return nil, gerror.NewCode(gerror.CodeMissingParameter, "inserting into table with empty data")
}
var (
list List
@ -276,12 +275,12 @@ func (m *Model) doInsertWithOption(insertOption int) (result sql.Result, err err
}
default:
return result, gerror.New(fmt.Sprint("unsupported list type:", kind))
return result, gerror.NewCodef(gerror.CodeInvalidParameter, "unsupported list type:%v", kind)
}
}
if len(list) < 1 {
return result, gerror.New("data list cannot be empty")
return result, gerror.NewCode(gerror.CodeMissingParameter, "data list cannot be empty")
}
// Automatic handling for creating/updating time.
@ -366,7 +365,11 @@ func (m *Model) formatDoInsertOption(insertOption int, columnNames []string) (op
}
default:
return option, gerror.Newf(`unsupported OnDuplicate parameter type "%s"`, reflect.TypeOf(m.onDuplicate))
return option, gerror.NewCodef(
gerror.CodeInvalidParameter,
`unsupported OnDuplicate parameter type "%s"`,
reflect.TypeOf(m.onDuplicate),
)
}
}
} else if onDuplicateExKeySet.Size() > 0 {
@ -406,7 +409,11 @@ func (m *Model) formatOnDuplicateExKeys(onDuplicateEx interface{}) ([]string, er
return gconv.Strings(onDuplicateEx), nil
default:
return nil, gerror.Newf(`unsupported OnDuplicateEx parameter type "%s"`, reflect.TypeOf(onDuplicateEx))
return nil, gerror.NewCodef(
gerror.CodeInvalidParameter,
`unsupported OnDuplicateEx parameter type "%s"`,
reflect.TypeOf(onDuplicateEx),
)
}
}

View File

@ -316,7 +316,7 @@ func (m *Model) Scan(pointer interface{}, where ...interface{}) error {
reflectKind = reflectValue.Kind()
if reflectKind != reflect.Ptr {
return gerror.New(`the parameter "pointer" for function Scan should type of pointer`)
return gerror.NewCode(gerror.CodeInvalidParameter, `the parameter "pointer" for function Scan should type of pointer`)
}
for reflectKind == reflect.Ptr {
reflectValue = reflectValue.Elem()
@ -331,7 +331,10 @@ func (m *Model) Scan(pointer interface{}, where ...interface{}) error {
return m.doStruct(pointer, where...)
default:
return gerror.New(`element of parameter "pointer" for function Scan should type of struct/*struct/[]struct/[]*struct`)
return gerror.NewCode(
gerror.CodeInvalidParameter,
`element of parameter "pointer" for function Scan should type of struct/*struct/[]struct/[]*struct`,
)
}
}

View File

@ -39,7 +39,7 @@ func (m *Model) Update(dataAndWhere ...interface{}) (result sql.Result, err erro
}
}()
if m.data == nil {
return nil, gerror.New("updating table with empty data")
return nil, gerror.NewCode(gerror.CodeMissingParameter, "updating table with empty data")
}
var (
updateData = m.data
@ -80,7 +80,7 @@ func (m *Model) Update(dataAndWhere ...interface{}) (result sql.Result, err erro
}
conditionStr := conditionWhere + conditionExtra
if !gstr.ContainsI(conditionStr, " WHERE ") {
return nil, gerror.New("there should be WHERE condition statement for UPDATE operation")
return nil, gerror.NewCode(gerror.CodeMissingParameter, "there should be WHERE condition statement for UPDATE operation")
}
return m.db.DoUpdate(
m.GetCtx(),

View File

@ -126,7 +126,8 @@ func (m *Model) doWithScanStruct(pointer interface{}) error {
}
}
if relatedFieldValue == nil {
return gerror.Newf(
return gerror.NewCodef(
gerror.CodeInvalidParameter,
`cannot find the related value for attribute name "%s" of with tag "%s"`,
relatedAttrName, withTag,
)
@ -238,7 +239,8 @@ func (m *Model) doWithScanStructs(pointer interface{}) error {
}
}
if relatedFieldValue == nil {
return gerror.Newf(
return gerror.NewCodef(
gerror.CodeInvalidParameter,
`cannot find the related value for attribute name "%s" of with tag "%s"`,
relatedAttrName, withTag,
)

View File

@ -59,7 +59,7 @@ func (s *Stmt) doStmtCommit(ctx context.Context, stmtType string, args ...interf
result = s.Stmt.QueryRowContext(ctx, args...)
default:
panic(gerror.Newf(`invalid stmtType: %s`, stmtType))
panic(gerror.NewCodef(gerror.CodeInvalidParameter, `invalid stmtType: %s`, stmtType))
}
var (
timestampMilli2 = gtime.TimestampMilli()

View File

@ -55,7 +55,7 @@ func doScanList(model *Model, result Result, listPointer interface{}, bindToAttr
}
// Necessary checks for parameters.
if bindToAttrName == "" {
return gerror.New(`bindToAttrName should not be empty`)
return gerror.NewCode(gerror.CodeInvalidParameter, `bindToAttrName should not be empty`)
}
var (
@ -67,12 +67,12 @@ func doScanList(model *Model, result Result, listPointer interface{}, bindToAttr
reflectKind = reflectValue.Kind()
}
if reflectKind != reflect.Ptr {
return gerror.Newf("listPointer should be type of *[]struct/*[]*struct, but got: %v", reflectKind)
return gerror.NewCodef(gerror.CodeInvalidParameter, "listPointer should be type of *[]struct/*[]*struct, but got: %v", reflectKind)
}
reflectValue = reflectValue.Elem()
reflectKind = reflectValue.Kind()
if reflectKind != reflect.Slice && reflectKind != reflect.Array {
return gerror.Newf("listPointer should be type of *[]struct/*[]*struct, but got: %v", reflectKind)
return gerror.NewCodef(gerror.CodeInvalidParameter, "listPointer should be type of *[]struct/*[]*struct, but got: %v", reflectKind)
}
length := len(result)
if length == 0 {
@ -135,7 +135,8 @@ func doScanList(model *Model, result Result, listPointer interface{}, bindToAttr
relationResultFieldName = array[0]
relationBindToSubAttrName = array[1]
if key, _ := gutil.MapPossibleItemByKey(result[0].Map(), relationResultFieldName); key == "" {
return gerror.Newf(
return gerror.NewCodef(
gerror.CodeInvalidParameter,
`cannot find possible related table field name "%s" from given relation key "%s"`,
relationResultFieldName,
relationKVStr,
@ -144,14 +145,14 @@ func doScanList(model *Model, result Result, listPointer interface{}, bindToAttr
relationResultFieldName = key
}
} else {
return gerror.New(`parameter relationKV should be format of "ResultFieldName:BindToAttrName"`)
return gerror.NewCode(gerror.CodeInvalidParameter, `parameter relationKV should be format of "ResultFieldName:BindToAttrName"`)
}
if relationResultFieldName != "" {
// Note that the value might be type of slice.
relationDataMap = result.MapKeyValue(relationResultFieldName)
}
if len(relationDataMap) == 0 {
return gerror.Newf(`cannot find the relation data map, maybe invalid relation given "%v"`, relationKV)
return gerror.NewCodef(gerror.CodeInvalidParameter, `cannot find the relation data map, maybe invalid relation given "%v"`, relationKV)
}
}
// Bind to target attribute.
@ -164,11 +165,19 @@ func doScanList(model *Model, result Result, listPointer interface{}, bindToAttr
)
if arrayItemType.Kind() == reflect.Ptr {
if bindToAttrField, ok = arrayItemType.Elem().FieldByName(bindToAttrName); !ok {
return gerror.Newf(`invalid parameter bindToAttrName: cannot find attribute with name "%s" from slice element`, bindToAttrName)
return gerror.NewCodef(
gerror.CodeInvalidParameter,
`invalid parameter bindToAttrName: cannot find attribute with name "%s" from slice element`,
bindToAttrName,
)
}
} else {
if bindToAttrField, ok = arrayItemType.FieldByName(bindToAttrName); !ok {
return gerror.Newf(`invalid parameter bindToAttrName: cannot find attribute with name "%s" from slice element`, bindToAttrName)
return gerror.NewCodef(
gerror.CodeInvalidParameter,
`invalid parameter bindToAttrName: cannot find attribute with name "%s" from slice element`,
bindToAttrName,
)
}
}
bindToAttrType = bindToAttrField.Type
@ -210,7 +219,7 @@ func doScanList(model *Model, result Result, listPointer interface{}, bindToAttr
relationFromAttrValue = arrayElemValue
}
if len(relationDataMap) > 0 && !relationFromAttrValue.IsValid() {
return gerror.Newf(`invalid relation specified: "%v"`, relationKV)
return gerror.NewCodef(gerror.CodeInvalidParameter, `invalid relation specified: "%v"`, relationKV)
}
// Check and find possible bind to attribute name.
if relationKVStr != "" && !relationBindToSubAttrNameChecked {
@ -224,7 +233,8 @@ func doScanList(model *Model, result Result, listPointer interface{}, bindToAttr
filedMap[relationFromAttrType.Field(i).Name] = struct{}{}
}
if key, _ := gutil.MapPossibleItemByKey(filedMap, relationBindToSubAttrName); key == "" {
return gerror.Newf(
return gerror.NewCodef(
gerror.CodeInvalidParameter,
`cannot find possible related attribute name "%s" from given relation key "%s"`,
relationBindToSubAttrName,
relationKVStr,
@ -255,10 +265,14 @@ func doScanList(model *Model, result Result, listPointer interface{}, bindToAttr
}
} else {
// May be the attribute does not exist yet.
return gerror.Newf(`invalid relation specified: "%v"`, relationKV)
return gerror.NewCodef(gerror.CodeInvalidParameter, `invalid relation specified: "%v"`, relationKV)
}
} else {
return gerror.Newf(`relationKey should not be empty as field "%s" is slice`, bindToAttrName)
return gerror.NewCodef(
gerror.CodeInvalidParameter,
`relationKey should not be empty as field "%s" is slice`,
bindToAttrName,
)
}
case reflect.Ptr:
@ -287,7 +301,7 @@ func doScanList(model *Model, result Result, listPointer interface{}, bindToAttr
}
} else {
// May be the attribute does not exist yet.
return gerror.Newf(`invalid relation specified: "%v"`, relationKV)
return gerror.NewCodef(gerror.CodeInvalidParameter, `invalid relation specified: "%v"`, relationKV)
}
} else {
if i >= len(result) {
@ -331,7 +345,7 @@ func doScanList(model *Model, result Result, listPointer interface{}, bindToAttr
}
} else {
// May be the attribute does not exist yet.
return gerror.Newf(`invalid relation specified: "%v"`, relationKV)
return gerror.NewCodef(gerror.CodeInvalidParameter, `invalid relation specified: "%v"`, relationKV)
}
} else {
if i >= len(result) {
@ -355,7 +369,7 @@ func doScanList(model *Model, result Result, listPointer interface{}, bindToAttr
}
default:
return gerror.Newf(`unsupported attribute type: %s`, bindToAttrKind.String())
return gerror.NewCodef(gerror.CodeInvalidParameter, `unsupported attribute type: %s`, bindToAttrKind.String())
}
}
reflect.ValueOf(listPointer).Elem().Set(arrayValue)

View File

@ -408,7 +408,7 @@ func (user *User) UnmarshalValue(value interface{}) error {
}
return nil
}
return gerror.Newf(`unsupported value type for UnmarshalValue: %v`, reflect.TypeOf(value))
return gerror.NewCodef(gerror.CodeInvalidParameter, `unsupported value type for UnmarshalValue: %v`, reflect.TypeOf(value))
}
func Test_Model_Scan_UnmarshalValue(t *testing.T) {

View File

@ -114,7 +114,7 @@ func ConfigFromStr(str string) (config *Config, err error) {
config.Port = DefaultRedisPort
}
} else {
err = gerror.Newf(`invalid redis configuration: "%s"`, str)
err = gerror.NewCodef(gerror.CodeInvalidConfiguration, `invalid redis configuration: "%s"`, str)
}
return
}

View File

@ -50,7 +50,7 @@ func (c *Conn) do(timeout time.Duration, commandName string, args ...interface{}
if timeout > 0 {
conn, ok := c.Conn.(redis.ConnWithTimeout)
if !ok {
return gvar.New(nil), gerror.New(`current connection does not support "ConnWithTimeout"`)
return gvar.New(nil), gerror.NewCode(gerror.CodeNotSupported, `current connection does not support "ConnWithTimeout"`)
}
return conn.DoWithTimeout(timeout, commandName, args...)
}
@ -107,7 +107,7 @@ func (c *Conn) ReceiveVar() (*gvar.Var, error) {
func (c *Conn) ReceiveVarWithTimeout(timeout time.Duration) (*gvar.Var, error) {
conn, ok := c.Conn.(redis.ConnWithTimeout)
if !ok {
return gvar.New(nil), gerror.New(`current connection does not support "ConnWithTimeout"`)
return gvar.New(nil), gerror.NewCode(gerror.CodeNotSupported, `current connection does not support "ConnWithTimeout"`)
}
return resultToVar(conn.ReceiveWithTimeout(timeout))
}

View File

@ -59,11 +59,11 @@ func Convert(dstCharset string, srcCharset string, src string) (dst string, err
transform.NewReader(bytes.NewReader([]byte(src)), e.NewDecoder()),
)
if err != nil {
return "", gerror.Newf("%s to utf8 failed. %v", srcCharset, err)
return "", gerror.WrapCodef(gerror.CodeInternalError, err, "%s to utf8 failed", srcCharset)
}
src = string(tmp)
} else {
return dst, gerror.Newf("unsupport srcCharset: %s", srcCharset)
return dst, gerror.NewCodef(gerror.CodeInvalidParameter, "unsupported srcCharset: %s", srcCharset)
}
}
// Do the converting from UTF-8 to <dstCharset>.
@ -73,11 +73,11 @@ func Convert(dstCharset string, srcCharset string, src string) (dst string, err
transform.NewReader(bytes.NewReader([]byte(src)), e.NewEncoder()),
)
if err != nil {
return "", gerror.Newf("utf to %s failed. %v", dstCharset, err)
return "", gerror.WrapCodef(gerror.CodeInternalError, err, "utf to %s failed", dstCharset)
}
dst = string(tmp)
} else {
return dst, gerror.Newf("unsupport dstCharset: %s", dstCharset)
return dst, gerror.NewCodef(gerror.CodeInvalidParameter, "unsupported dstCharset: %s", dstCharset)
}
} else {
dst = src

View File

@ -70,7 +70,7 @@ func Decode(data []byte) (res map[string]interface{}, err error) {
}
if haveSection == false {
return nil, gerror.New("failed to parse INI file, section not found")
return nil, gerror.NewCode(gerror.CodeInvalidParameter, "failed to parse INI file, section not found")
}
return res, nil
}

View File

@ -264,7 +264,7 @@ func doLoadContentWithOptions(dataType string, data []byte, options Options) (*J
return nil, err
}
default:
err = gerror.New("unsupported type for loading")
err = gerror.NewCode(gerror.CodeInvalidParameter, "unsupported type for loading")
}
if err != nil {
return nil, err

View File

@ -49,7 +49,7 @@ func New(text string) error {
return &Error{
stack: callers(),
text: text,
code: -1,
code: CodeNil,
}
}
@ -58,7 +58,7 @@ func Newf(format string, args ...interface{}) error {
return &Error{
stack: callers(),
text: fmt.Sprintf(format, args...),
code: -1,
code: CodeNil,
}
}
@ -68,7 +68,7 @@ func NewSkip(skip int, text string) error {
return &Error{
stack: callers(skip),
text: text,
code: -1,
code: CodeNil,
}
}
@ -78,7 +78,7 @@ func NewSkipf(skip int, format string, args ...interface{}) error {
return &Error{
stack: callers(skip),
text: fmt.Sprintf(format, args...),
code: -1,
code: CodeNil,
}
}

View File

@ -0,0 +1,25 @@
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
//
// This Source Code Form is subject to the terms of the MIT License.
// If a copy of the MIT was not distributed with this file,
// You can obtain one at https://github.com/gogf/gf.
package gerror
// Reserved internal error code of framework: code < 1000.
const (
CodeNil = -1 // No error code specified.
CodeOk = 0 // It is OK without error.
CodeInternalError = 50 // An error occurred internally.
CodeValidationFailed = 51 // Data validation failed.
CodeDbOperationError = 52 // Database operation error.
CodeInvalidParameter = 53 // The given parameter for current operation is invalid.
CodeMissingParameter = 54 // Parameter for current operation is missing.
CodeInvalidOperation = 55 // The function cannot be used like this.
CodeInvalidConfiguration = 56 // The configuration is invalid for current operation.
CodeMissingConfiguration = 57 // The configuration is missing for current operation.
CodeNotImplemented = 58 // The operation is not implemented yet.
CodeNotSupported = 59 // The operation is not supported yet.
CodeOperationFailed = 60 // I tried, but I cannot give you what you want.
)

View File

@ -179,6 +179,9 @@ func (err *Error) MarshalJSON() ([]byte, error) {
// formatSubStack formats the stack for error.
func formatSubStack(st stack, buffer *bytes.Buffer) {
if st == nil {
return
}
index := 1
space := " "
for _, p := range st {

View File

@ -0,0 +1,28 @@
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
//
// This Source Code Form is subject to the terms of the MIT License.
// If a copy of the MIT was not distributed with this file,
// You can obtain one at https://github.com/gogf/gf.
package gerror
// Option is option for creating error.
type Option struct {
Error error // Wrapped error.
Stack bool // Record stack information into error.
Text string // Error text, which is created by New* functions.
Code int // Error code if necessary.
}
// NewOption creates and returns an error with Option.
func NewOption(option Option) error {
err := &Error{
error: option.Error,
text: option.Text,
code: option.Code,
}
if option.Stack {
err.stack = callers()
}
return err
}

View File

@ -53,21 +53,24 @@ func Database(name ...string) gdb.DB {
if configFilePath == "" {
exampleFileName := "config.example.toml"
if exampleConfigFilePath, _ := Config().GetFilePath(exampleFileName); exampleConfigFilePath != "" {
panic(gerror.Wrapf(
panic(gerror.WrapCodef(
gerror.CodeMissingConfiguration,
err,
`configuration file "%s" not found, but found "%s", did you miss renaming the example configuration file?`,
Config().GetFileName(),
exampleFileName,
))
} else {
panic(gerror.Wrapf(
panic(gerror.WrapCodef(
gerror.CodeMissingConfiguration,
err,
`configuration file "%s" not found, did you miss the configuration file or the misspell the configuration file name?`,
Config().GetFileName(),
))
}
}
panic(gerror.Wrapf(
panic(gerror.WrapCodef(
gerror.CodeMissingConfiguration,
err,
`database initialization failed: "%s" node not found, is configuration file or configuration node missing?`,
configNodeNameDatabase,

View File

@ -101,7 +101,7 @@ func (m *Manager) SetPath(path string) error {
} else {
realPath, _ := gfile.Search(path)
if realPath == "" {
return gerror.Newf(`%s does not exist`, path)
return gerror.NewCodef(gerror.CodeInvalidParameter, `%s does not exist`, path)
}
m.options.Path = realPath
}

View File

@ -7,7 +7,8 @@
package structs
import (
"github.com/gogf/gf/errors/gerror"
"errors"
"fmt"
"reflect"
)
@ -49,9 +50,11 @@ exitLoop:
reflectKind = reflectValue.Kind()
}
if reflectKind != reflect.Struct {
return nil, gerror.Newf(
`invalid object kind "%s", kind of "struct" is required`,
reflectKind,
return nil, errors.New(
fmt.Sprintf(
`invalid object kind "%s", kind of "struct" is required`,
reflectKind,
),
)
}
reflectType = reflectValue.Type()

View File

@ -26,6 +26,7 @@ func niceCallFunc(f func()) {
switch exception {
case exceptionExit, exceptionExitAll:
return
default:
if _, ok := exception.(errorStack); ok {
// It's already an error that has stack info.
@ -35,9 +36,13 @@ func niceCallFunc(f func()) {
// Note that there's a skip pointing the start stacktrace
// of the real error point.
if err, ok := exception.(error); ok {
panic(gerror.Wrap(err, ""))
if gerror.Code(err) != gerror.CodeNil {
panic(gerror.Wrap(err, ""))
} else {
panic(gerror.WrapCode(gerror.CodeInternalError, err, ""))
}
} else {
panic(gerror.NewSkipf(1, "%v", exception))
panic(gerror.NewCodeSkipf(gerror.CodeInternalError, 1, "%v", exception))
}
}
}

View File

@ -27,8 +27,12 @@ func MiddlewareHandlerResponse(r *Request) {
)
res, err = r.GetHandlerResponse()
if err != nil {
code := gerror.Code(err)
if code == gerror.CodeNil {
code = gerror.CodeInternalError
}
internalErr = r.Response.WriteJson(DefaultHandlerResponse{
Code: gerror.Code(err),
Code: code,
Message: err.Error(),
Data: nil,
})
@ -38,7 +42,7 @@ func MiddlewareHandlerResponse(r *Request) {
return
}
internalErr = r.Response.WriteJson(DefaultHandlerResponse{
Code: 0,
Code: gerror.CodeOk,
Message: "",
Data: res,
})

View File

@ -127,7 +127,7 @@ func (m *middleware) Next() {
// Create a new error with stack info.
// Note that there's a skip pointing the start stacktrace
// of the real error point.
m.request.error = gerror.WrapSkip(1, exception, "")
m.request.error = gerror.WrapCodeSkip(gerror.CodeInternalError, 1, exception, "")
}
m.request.Response.WriteStatus(http.StatusInternalServerError, exception)
loop = false

View File

@ -35,14 +35,17 @@ type UploadFiles []*UploadFile
// Note that it will OVERWRITE the target file if there's already a same name file exist.
func (f *UploadFile) Save(dirPath string, randomlyRename ...bool) (filename string, err error) {
if f == nil {
return "", gerror.New("file is empty, maybe you retrieve it from invalid field name or form enctype")
return "", gerror.NewCode(
gerror.CodeMissingParameter,
"file is empty, maybe you retrieve it from invalid field name or form enctype",
)
}
if !gfile.Exists(dirPath) {
if err = gfile.Mkdir(dirPath); err != nil {
return
}
} else if !gfile.IsDir(dirPath) {
return "", gerror.New(`parameter "dirPath" should be a directory path`)
return "", gerror.NewCode(gerror.CodeInvalidParameter, `parameter "dirPath" should be a directory path`)
}
file, err := f.Open()
@ -76,7 +79,10 @@ func (f *UploadFile) Save(dirPath string, randomlyRename ...bool) (filename stri
// The parameter <randomlyRename> specifies whether randomly renames all the file names.
func (fs UploadFiles) Save(dirPath string, randomlyRename ...bool) (filenames []string, err error) {
if len(fs) == 0 {
return nil, gerror.New("file array is empty, maybe you retrieve it from invalid field name or form enctype")
return nil, gerror.NewCode(
gerror.CodeMissingParameter,
"file array is empty, maybe you retrieve it from invalid field name or form enctype",
)
}
for _, f := range fs {
if filename, err := f.Save(dirPath, randomlyRename...); err != nil {

View File

@ -125,7 +125,7 @@ func (s *Server) Start() error {
// Server can only be run once.
if s.Status() == ServerStatusRunning {
return gerror.New("server is already running")
return gerror.NewCode(gerror.CodeInvalidOperation, "server is already running")
}
// Logging path setting check.
@ -141,7 +141,7 @@ func (s *Server) Start() error {
path = gfile.Join(s.config.SessionPath, s.name)
if !gfile.Exists(path) {
if err := gfile.Mkdir(path); err != nil {
return gerror.Wrapf(err, `mkdir failed for "%s"`, path)
return gerror.WrapCodef(gerror.CodeInternalError, err, `mkdir failed for "%s"`, path)
}
}
}
@ -175,7 +175,10 @@ func (s *Server) Start() error {
// If there's no route registered and no static service enabled,
// it then returns an error of invalid usage of server.
if len(s.routesMap) == 0 && !s.config.FileServerEnabled {
return gerror.New(`there's no route set or static feature enabled, did you forget import the router?`)
return gerror.NewCode(
gerror.CodeInvalidOperation,
`there's no route set or static feature enabled, did you forget import the router?`,
)
}
// Start the HTTP server.

View File

@ -52,7 +52,7 @@ var serverProcessStatus = gtype.NewInt()
// The optional parameter <newExeFilePath> specifies the new binary file for creating process.
func RestartAllServer(newExeFilePath ...string) error {
if !gracefulEnabled {
return gerror.New("graceful reload feature is disabled")
return gerror.NewCode(gerror.CodeInvalidOperation, "graceful reload feature is disabled")
}
serverActionLocker.Lock()
defer serverActionLocker.Unlock()
@ -85,9 +85,10 @@ func checkProcessStatus() error {
if status > 0 {
switch status {
case adminActionRestarting:
return gerror.New("server is restarting")
return gerror.NewCode(gerror.CodeInvalidOperation, "server is restarting")
case adminActionShuttingDown:
return gerror.New("server is shutting down")
return gerror.NewCode(gerror.CodeInvalidOperation, "server is shutting down")
}
}
return nil
@ -98,7 +99,11 @@ func checkProcessStatus() error {
func checkActionFrequency() error {
interval := gtime.TimestampMilli() - serverActionLastTime.Val()
if interval < adminActionIntervalLimit {
return gerror.Newf("too frequent action, please retry in %d ms", adminActionIntervalLimit-interval)
return gerror.NewCodef(
gerror.CodeInvalidOperation,
"too frequent action, please retry in %d ms",
adminActionIntervalLimit-interval,
)
}
serverActionLastTime.Set(gtime.TimestampMilli())
return nil

View File

@ -122,7 +122,7 @@ func (s *gracefulServer) ListenAndServeTLS(certFile, keyFile string, tlsConfig .
}
if err != nil {
return gerror.Newf(`open cert file "%s","%s" failed: %s`, certFile, keyFile, err.Error())
return gerror.WrapCodef(gerror.CodeInternalError, err, `open cert file "%s","%s" failed`, certFile, keyFile)
}
ln, err := s.getNetListener()
if err != nil {

View File

@ -67,9 +67,13 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if exception := recover(); exception != nil {
request.Response.WriteStatus(http.StatusInternalServerError)
if err, ok := exception.(error); ok {
s.handleErrorLog(gerror.Wrap(err, ""), request)
if code := gerror.Code(err); code != gerror.CodeNil {
s.handleErrorLog(gerror.Wrap(err, ""), request)
} else {
s.handleErrorLog(gerror.WrapCode(gerror.CodeInternalError, err, ""), request)
}
} else {
s.handleErrorLog(gerror.Newf("%v", exception), request)
s.handleErrorLog(gerror.NewCodef(gerror.CodeInternalError, "%v", exception), request)
}
}
}

View File

@ -53,7 +53,7 @@ func (s *Server) parsePattern(pattern string) (domain, method, path string, err
}
}
if path == "" {
err = gerror.New("invalid pattern: URI should not be empty")
err = gerror.NewCode(gerror.CodeInvalidParameter, "invalid pattern: URI should not be empty")
}
if path != "/" {
path = strings.TrimRight(path, "/")

View File

@ -128,12 +128,14 @@ func (s *Server) checkAndCreateFuncInfo(f interface{}, pkgPath, objName, methodN
reflectType := reflect.TypeOf(f)
if reflectType.NumIn() == 0 || reflectType.NumIn() > 2 || reflectType.NumOut() > 2 {
if pkgPath != "" {
err = gerror.Newf(
err = gerror.NewCodef(
gerror.CodeInvalidParameter,
`invalid handler: %s.%s.%s defined as "%s", but "func(*ghttp.Request)" or "func(context.Context)/func(context.Context,Request)/func(context.Context,Request) error/func(context.Context,Request)(Response,error)" is required`,
pkgPath, objName, methodName, reflect.TypeOf(f).String(),
)
} else {
err = gerror.Newf(
err = gerror.NewCodef(
gerror.CodeInvalidParameter,
`invalid handler: defined as "%s", but "func(*ghttp.Request)" or "func(context.Context)/func(context.Context,Request)/func(context.Context,Request) error/func(context.Context,Request)(Response,error)" is required`,
reflect.TypeOf(f).String(),
)
@ -142,7 +144,8 @@ func (s *Server) checkAndCreateFuncInfo(f interface{}, pkgPath, objName, methodN
}
if reflectType.In(0).String() != "context.Context" {
err = gerror.Newf(
err = gerror.NewCodef(
gerror.CodeInvalidParameter,
`invalid handler: defined as "%s", but the first input parameter should be type of "context.Context"`,
reflect.TypeOf(f).String(),
)
@ -150,7 +153,8 @@ func (s *Server) checkAndCreateFuncInfo(f interface{}, pkgPath, objName, methodN
}
if reflectType.NumOut() > 0 && reflectType.Out(reflectType.NumOut()-1).String() != "error" {
err = gerror.Newf(
err = gerror.NewCodef(
gerror.CodeInvalidParameter,
`invalid handler: defined as "%s", but the last output parameter should be type of "error"`,
reflect.TypeOf(f).String(),
)

View File

@ -242,27 +242,27 @@ func (c *Client) SetProxy(proxyURL string) {
}
}
// SetTlsKeyCrt sets the certificate and key file for TLS configuration of client.
// SetTLSKeyCrt sets the certificate and key file for TLS configuration of client.
func (c *Client) SetTLSKeyCrt(crtFile, keyFile string) error {
tlsConfig, err := LoadKeyCrt(crtFile, keyFile)
if err != nil {
return err
return gerror.WrapCode(gerror.CodeInternalError, err, "LoadKeyCrt failed")
}
if v, ok := c.Transport.(*http.Transport); ok {
tlsConfig.InsecureSkipVerify = true
v.TLSClientConfig = tlsConfig
return nil
}
return gerror.New(`cannot set TLSClientConfig for custom Transport of the client`)
return gerror.NewCode(gerror.CodeInternalError, `cannot set TLSClientConfig for custom Transport of the client`)
}
// SetTlsConfig sets the TLS configuration of client.
// SetTLSConfig sets the TLS configuration of client.
func (c *Client) SetTLSConfig(tlsConfig *tls.Config) error {
if v, ok := c.Transport.(*http.Transport); ok {
v.TLSClientConfig = tlsConfig
return nil
}
return gerror.New(`cannot set TLSClientConfig for custom Transport of the client`)
return gerror.NewCode(gerror.CodeInternalError, `cannot set TLSClientConfig for custom Transport of the client`)
}
// LoadKeyCrt creates and returns a TLS configuration object with given certificate and key files.

View File

@ -188,7 +188,7 @@ func (c *Client) prepareRequest(method, url string, data ...interface{}) (req *h
if len(array[1]) > 6 && strings.Compare(array[1][0:6], "@file:") == 0 {
path := array[1][6:]
if !gfile.Exists(path) {
return nil, gerror.Newf(`"%s" does not exist`, path)
return nil, gerror.NewCodef(gerror.CodeInvalidParameter, `"%s" does not exist`, path)
}
if file, err := writer.CreateFormFile(array[0], gfile.Basename(path)); err == nil {
if f, err := os.Open(path); err == nil {

View File

@ -38,7 +38,7 @@ func GetIntranetIp() (ip string, err error) {
return "", err
}
if len(ips) == 0 {
return "", gerror.New("no intranet ip found")
return "", gerror.NewCode(gerror.CodeOperationFailed, "no intranet ip found")
}
return ips[0], nil
}

View File

@ -116,7 +116,7 @@ func (s *Server) Close() error {
// Run starts running the TCP Server.
func (s *Server) Run() (err error) {
if s.handler == nil {
err = gerror.New("start running failed: socket handler not defined")
err = gerror.NewCode(gerror.CodeMissingConfiguration, "start running failed: socket handler not defined")
glog.Error(err)
return
}

View File

@ -78,7 +78,7 @@ func (s *Server) Close() error {
// Run starts listening UDP connection.
func (s *Server) Run() error {
if s.handler == nil {
err := gerror.New("start running failed: socket handler not defined")
err := gerror.NewCode(gerror.CodeMissingConfiguration, "start running failed: socket handler not defined")
glog.Error(err)
return err
}

View File

@ -142,7 +142,7 @@ func (c *Config) SetPath(path string) error {
} else {
buffer.WriteString(fmt.Sprintf(`[gcfg] SetPath failed: path "%s" does not exist`, path))
}
err := gerror.New(buffer.String())
err := gerror.NewCode(gerror.CodeOperationFailed, buffer.String())
if errorPrint() {
glog.Error(err)
}
@ -219,14 +219,14 @@ func (c *Config) AddPath(path string) error {
} else {
buffer.WriteString(fmt.Sprintf(`[gcfg] AddPath failed: path "%s" does not exist`, path))
}
err := gerror.New(buffer.String())
err := gerror.NewCode(gerror.CodeOperationFailed, buffer.String())
if errorPrint() {
glog.Error(err)
}
return err
}
if !isDir {
err := gerror.Newf(`[gcfg] AddPath failed: path "%s" should be directory type`, path)
err := gerror.NewCodef(gerror.CodeInvalidParameter, `[gcfg] AddPath failed: path "%s" should be directory type`, path)
if errorPrint() {
glog.Error(err)
}
@ -329,7 +329,7 @@ func (c *Config) GetFilePath(file ...string) (path string, err error) {
} else {
buffer.WriteString(fmt.Sprintf("[gcfg] cannot find config file \"%s\" with no path configured", name))
}
err = gerror.New(buffer.String())
err = gerror.NewCode(gerror.CodeOperationFailed, buffer.String())
}
return
}

View File

@ -295,7 +295,7 @@ func (c *Config) GetStruct(pattern string, pointer interface{}, mapping ...map[s
if j := c.getJson(); j != nil {
return j.GetStruct(pattern, pointer, mapping...)
}
return gerror.New("configuration not found")
return gerror.NewCode(gerror.CodeMissingConfiguration, "configuration not found")
}
// GetStructs converts any slice to given struct slice.
@ -303,7 +303,7 @@ func (c *Config) GetStructs(pattern string, pointer interface{}, mapping ...map[
if j := c.getJson(); j != nil {
return j.GetStructs(pattern, pointer, mapping...)
}
return gerror.New("configuration not found")
return gerror.NewCode(gerror.CodeMissingConfiguration, "configuration not found")
}
// GetMapToMap retrieves the value by specified `pattern` and converts it to specified map variable.
@ -312,7 +312,7 @@ func (c *Config) GetMapToMap(pattern string, pointer interface{}, mapping ...map
if j := c.getJson(); j != nil {
return j.GetMapToMap(pattern, pointer, mapping...)
}
return gerror.New("configuration not found")
return gerror.NewCode(gerror.CodeMissingConfiguration, "configuration not found")
}
// GetMapToMaps retrieves the value by specified `pattern` and converts it to specified map slice
@ -322,7 +322,7 @@ func (c *Config) GetMapToMaps(pattern string, pointer interface{}, mapping ...ma
if j := c.getJson(); j != nil {
return j.GetMapToMaps(pattern, pointer, mapping...)
}
return gerror.New("configuration not found")
return gerror.NewCode(gerror.CodeMissingConfiguration, "configuration not found")
}
// GetMapToMapsDeep retrieves the value by specified `pattern` and converts it to specified map slice
@ -332,7 +332,7 @@ func (c *Config) GetMapToMapsDeep(pattern string, pointer interface{}, mapping .
if j := c.getJson(); j != nil {
return j.GetMapToMapsDeep(pattern, pointer, mapping...)
}
return gerror.New("configuration not found")
return gerror.NewCode(gerror.CodeMissingConfiguration, "configuration not found")
}
// Map converts current Json object to map[string]interface{}. It returns nil if fails.
@ -358,7 +358,7 @@ func (c *Config) Struct(pointer interface{}, mapping ...map[string]string) error
if j := c.getJson(); j != nil {
return j.Struct(pointer, mapping...)
}
return gerror.New("configuration not found")
return gerror.NewCode(gerror.CodeMissingConfiguration, "configuration not found")
}
// Structs converts current Json object to specified object slice.
@ -367,7 +367,7 @@ func (c *Config) Structs(pointer interface{}, mapping ...map[string]string) erro
if j := c.getJson(); j != nil {
return j.Structs(pointer, mapping...)
}
return gerror.New("configuration not found")
return gerror.NewCode(gerror.CodeMissingConfiguration, "configuration not found")
}
// MapToMap converts current Json object to specified map variable.
@ -376,7 +376,7 @@ func (c *Config) MapToMap(pointer interface{}, mapping ...map[string]string) err
if j := c.getJson(); j != nil {
return j.MapToMap(pointer, mapping...)
}
return gerror.New("configuration not found")
return gerror.NewCode(gerror.CodeMissingConfiguration, "configuration not found")
}
// MapToMaps converts current Json object to specified map variable slice.
@ -385,7 +385,7 @@ func (c *Config) MapToMaps(pointer interface{}, mapping ...map[string]string) er
if j := c.getJson(); j != nil {
return j.MapToMaps(pointer, mapping...)
}
return gerror.New("configuration not found")
return gerror.NewCode(gerror.CodeMissingConfiguration, "configuration not found")
}
// Clear removes all parsed configuration files content cache,

View File

@ -14,14 +14,14 @@ import (
// BindHandle registers callback function <f> with <cmd>.
func BindHandle(cmd string, f func()) error {
if _, ok := defaultCommandFuncMap[cmd]; ok {
return gerror.New("duplicated handle for command:" + cmd)
return gerror.NewCode(gerror.CodeInvalidOperation, "duplicated handle for command:"+cmd)
} else {
defaultCommandFuncMap[cmd] = f
}
return nil
}
// BindHandle registers callback function with map <m>.
// BindHandleMap registers callback function with map <m>.
func BindHandleMap(m map[string]func()) error {
var err error
for k, v := range m {
@ -37,7 +37,7 @@ func RunHandle(cmd string) error {
if handle, ok := defaultCommandFuncMap[cmd]; ok {
handle()
} else {
return gerror.New("no handle found for command:" + cmd)
return gerror.NewCode(gerror.CodeMissingConfiguration, "no handle found for command:"+cmd)
}
return nil
}
@ -49,10 +49,10 @@ func AutoRun() error {
if handle, ok := defaultCommandFuncMap[cmd]; ok {
handle()
} else {
return gerror.New("no handle found for command:" + cmd)
return gerror.NewCode(gerror.CodeMissingConfiguration, "no handle found for command:"+cmd)
}
} else {
return gerror.New("no command found")
return gerror.NewCode(gerror.CodeMissingParameter, "no command found")
}
return nil
}

View File

@ -94,7 +94,7 @@ func ParseWithArgs(args []string, supportedOptions map[string]bool, strict ...bo
i++
continue
} else if parser.strict {
return nil, gerror.Newf(`invalid option '%s'`, args[i])
return nil, gerror.NewCodef(gerror.CodeInvalidParameter, `invalid option '%s'`, args[i])
}
}
}

View File

@ -14,7 +14,7 @@ import (
// BindHandle registers callback function <f> with <cmd>.
func (p *Parser) BindHandle(cmd string, f func()) error {
if _, ok := p.commandFuncMap[cmd]; ok {
return gerror.New("duplicated handle for command:" + cmd)
return gerror.NewCode(gerror.CodeInvalidOperation, "duplicated handle for command:"+cmd)
} else {
p.commandFuncMap[cmd] = f
}
@ -37,7 +37,7 @@ func (p *Parser) RunHandle(cmd string) error {
if handle, ok := p.commandFuncMap[cmd]; ok {
handle()
} else {
return gerror.New("no handle found for command:" + cmd)
return gerror.NewCode(gerror.CodeMissingConfiguration, "no handle found for command:"+cmd)
}
return nil
}
@ -49,10 +49,10 @@ func (p *Parser) AutoRun() error {
if handle, ok := p.commandFuncMap[cmd]; ok {
handle()
} else {
return gerror.New("no handle found for command:" + cmd)
return gerror.NewCode(gerror.CodeMissingConfiguration, "no handle found for command:"+cmd)
}
} else {
return gerror.New("no command found")
return gerror.NewCode(gerror.CodeMissingParameter, "no command found")
}
return nil
}

View File

@ -62,7 +62,7 @@ func (c *Cron) GetLogLevel() int {
func (c *Cron) Add(pattern string, job func(), name ...string) (*Entry, error) {
if len(name) > 0 {
if c.Search(name[0]) != nil {
return nil, gerror.Newf(`cron job "%s" already exists`, name[0])
return nil, gerror.NewCodef(gerror.CodeInvalidOperation, `cron job "%s" already exists`, name[0])
}
}
return c.addEntry(pattern, job, false, name...)

View File

@ -90,7 +90,7 @@ func newSchedule(pattern string) (*cronSchedule, error) {
}, nil
}
} else {
return nil, gerror.Newf(`invalid pattern: "%s"`, pattern)
return nil, gerror.NewCodef(gerror.CodeInvalidParameter, `invalid pattern: "%s"`, pattern)
}
}
// Handle the common cron pattern, like:
@ -139,7 +139,7 @@ func newSchedule(pattern string) (*cronSchedule, error) {
}
return schedule, nil
} else {
return nil, gerror.Newf(`invalid pattern: "%s"`, pattern)
return nil, gerror.NewCodef(gerror.CodeInvalidParameter, `invalid pattern: "%s"`, pattern)
}
}
@ -156,7 +156,7 @@ func parseItem(item string, min int, max int, allowQuestionMark bool) (map[int]s
intervalArray := strings.Split(item, "/")
if len(intervalArray) == 2 {
if i, err := strconv.Atoi(intervalArray[1]); err != nil {
return nil, gerror.Newf(`invalid pattern item: "%s"`, item)
return nil, gerror.NewCodef(gerror.CodeInvalidParameter, `invalid pattern item: "%s"`, item)
} else {
interval = i
}
@ -178,7 +178,7 @@ func parseItem(item string, min int, max int, allowQuestionMark bool) (map[int]s
// Eg: */5
if rangeArray[0] != "*" {
if i, err := parseItemValue(rangeArray[0], fieldType); err != nil {
return nil, gerror.Newf(`invalid pattern item: "%s"`, item)
return nil, gerror.NewCodef(gerror.CodeInvalidParameter, `invalid pattern item: "%s"`, item)
} else {
rangeMin = i
rangeMax = i
@ -186,7 +186,7 @@ func parseItem(item string, min int, max int, allowQuestionMark bool) (map[int]s
}
if len(rangeArray) == 2 {
if i, err := parseItemValue(rangeArray[1], fieldType); err != nil {
return nil, gerror.Newf(`invalid pattern item: "%s"`, item)
return nil, gerror.NewCodef(gerror.CodeInvalidParameter, `invalid pattern item: "%s"`, item)
} else {
rangeMax = i
}
@ -220,7 +220,7 @@ func parseItemValue(value string, fieldType byte) (int, error) {
}
}
}
return 0, gerror.Newf(`invalid pattern value: "%s"`, value)
return 0, gerror.NewCodef(gerror.CodeInvalidParameter, `invalid pattern value: "%s"`, value)
}
// meet checks if the given time <t> meets the runnable point for the job.

View File

@ -7,8 +7,8 @@
package gfile
import (
"errors"
"fmt"
"github.com/gogf/gf/errors/gerror"
"io"
"io/ioutil"
"os"
@ -21,10 +21,10 @@ import (
// or else it calls CopyDir.
func Copy(src string, dst string) error {
if src == "" {
return errors.New("source path cannot be empty")
return gerror.NewCode(gerror.CodeInvalidParameter, "source path cannot be empty")
}
if dst == "" {
return errors.New("destination path cannot be empty")
return gerror.NewCode(gerror.CodeInvalidParameter, "destination path cannot be empty")
}
if IsFile(src) {
return CopyFile(src, dst)
@ -40,10 +40,10 @@ func Copy(src string, dst string) error {
// Thanks: https://gist.github.com/r0l1/92462b38df26839a3ca324697c8cba04
func CopyFile(src, dst string) (err error) {
if src == "" {
return errors.New("source file cannot be empty")
return gerror.NewCode(gerror.CodeInvalidParameter, "source file cannot be empty")
}
if dst == "" {
return errors.New("destination file cannot be empty")
return gerror.NewCode(gerror.CodeInvalidParameter, "destination file cannot be empty")
}
// If src and dst are the same path, it does nothing.
if src == dst {
@ -87,10 +87,10 @@ func CopyFile(src, dst string) (err error) {
// Note that, the Source directory must exist and symlinks are ignored and skipped.
func CopyDir(src string, dst string) (err error) {
if src == "" {
return errors.New("source directory cannot be empty")
return gerror.NewCode(gerror.CodeInvalidParameter, "source directory cannot be empty")
}
if dst == "" {
return errors.New("destination directory cannot be empty")
return gerror.NewCode(gerror.CodeInvalidParameter, "destination directory cannot be empty")
}
// If src and dst are the same path, it does nothing.
if src == dst {

View File

@ -8,7 +8,7 @@ package gfile
import (
"bytes"
"errors"
"github.com/gogf/gf/errors/gerror"
"os"
"os/exec"
"os/user"
@ -56,7 +56,7 @@ func homeUnix() (string, error) {
result := strings.TrimSpace(stdout.String())
if result == "" {
return "", errors.New("blank output when reading home directory")
return "", gerror.NewCode(gerror.CodeInternalError, "blank output when reading home directory")
}
return result, nil
@ -73,7 +73,7 @@ func homeWindows() (string, error) {
home = os.Getenv("USERPROFILE")
}
if home == "" {
return "", errors.New("HOMEDRIVE, HOMEPATH, and USERPROFILE are blank")
return "", gerror.NewCode(gerror.CodeOperationFailed, "HOMEDRIVE, HOMEPATH, and USERPROFILE are blank")
}
return home, nil

View File

@ -137,7 +137,7 @@ func ScanDirFileFunc(path string, pattern string, recursive bool, handler func(p
// string, or else it appends the sub-file path to result slice.
func doScanDir(depth int, path string, pattern string, recursive bool, handler func(path string) string) ([]string, error) {
if depth >= maxScanDepth {
return nil, gerror.Newf("directory scanning exceeds max recursive depth: %d", maxScanDepth)
return nil, gerror.NewCodef(gerror.CodeOperationFailed, "directory scanning exceeds max recursive depth: %d", maxScanDepth)
}
list := ([]string)(nil)
file, err := os.Open(path)

View File

@ -8,8 +8,8 @@ package gfile
import (
"bytes"
"errors"
"fmt"
"github.com/gogf/gf/errors/gerror"
"github.com/gogf/gf/container/garray"
)
@ -52,7 +52,7 @@ func Search(name string, prioritySearchPaths ...string) (realPath string, err er
buffer.WriteString(fmt.Sprintf("\n%d. %s", k+1, v))
}
})
err = errors.New(buffer.String())
err = gerror.NewCode(gerror.CodeOperationFailed, buffer.String())
}
return
}

View File

@ -7,8 +7,8 @@
package gfpool
import (
"errors"
"fmt"
"github.com/gogf/gf/errors/gerror"
"os"
"time"
)
@ -41,7 +41,7 @@ func Open(path string, flag int, perm os.FileMode, ttl ...time.Duration) (file *
// Stat returns the FileInfo structure describing file.
func (f *File) Stat() (os.FileInfo, error) {
if f.stat == nil {
return nil, errors.New("file stat is empty")
return nil, gerror.NewCode(gerror.CodeInternalError, "file stat is empty")
}
return f.stat, nil
}

View File

@ -139,7 +139,7 @@ func RemoveCallback(callbackId int) error {
callback = r.(*Callback)
}
if callback == nil {
return gerror.Newf(`callback for id %d not found`, callbackId)
return gerror.NewCodef(gerror.CodeInvalidParameter, `callback for id %d not found`, callbackId)
}
w.RemoveCallback(callbackId)
return nil

View File

@ -66,7 +66,7 @@ func (w *Watcher) AddOnce(name, path string, callbackFunc func(event *Event), re
func (w *Watcher) addWithCallbackFunc(name, path string, callbackFunc func(event *Event), recursive ...bool) (callback *Callback, err error) {
// Check and convert the given path to absolute path.
if t := fileRealPath(path); t == "" {
return nil, gerror.Newf(`"%s" does not exist`, path)
return nil, gerror.NewCodef(gerror.CodeInvalidParameter, `"%s" does not exist`, path)
} else {
path = t
}

View File

@ -81,7 +81,7 @@ func (l *Logger) SetConfig(config Config) error {
// SetConfigWithMap set configurations with map for the logger.
func (l *Logger) SetConfigWithMap(m map[string]interface{}) error {
if m == nil || len(m) == 0 {
return gerror.New("configuration cannot be empty")
return gerror.NewCode(gerror.CodeInvalidParameter, "configuration cannot be empty")
}
// The m now is a shallow copy of m.
// A little tricky, isn't it?
@ -92,7 +92,7 @@ func (l *Logger) SetConfigWithMap(m map[string]interface{}) error {
if level, ok := levelStringMap[strings.ToUpper(gconv.String(levelValue))]; ok {
m[levelKey] = level
} else {
return gerror.Newf(`invalid level string: %v`, levelValue)
return gerror.NewCodef(gerror.CodeInvalidParameter, `invalid level string: %v`, levelValue)
}
}
// Change string configuration to int value for file rotation size.
@ -100,7 +100,7 @@ func (l *Logger) SetConfigWithMap(m map[string]interface{}) error {
if rotateSizeValue != nil {
m[rotateSizeKey] = gfile.StrToSize(gconv.String(rotateSizeValue))
if m[rotateSizeKey] == -1 {
return gerror.Newf(`invalid rotate size: %v`, rotateSizeValue)
return gerror.NewCodef(gerror.CodeInvalidConfiguration, `invalid rotate size: %v`, rotateSizeValue)
}
}
if err := gconv.Struct(m, &l.config); err != nil {
@ -205,12 +205,11 @@ func (l *Logger) GetWriter() io.Writer {
// SetPath sets the directory path for file logging.
func (l *Logger) SetPath(path string) error {
if path == "" {
return gerror.New("logging path is empty")
return gerror.NewCode(gerror.CodeInvalidParameter, "logging path is empty")
}
if !gfile.Exists(path) {
if err := gfile.Mkdir(path); err != nil {
//fmt.Fprintln(os.Stderr, fmt.Sprintf(`[glog] mkdir "%s" failed: %s`, path, err.Error()))
return gerror.Wrapf(err, `Mkdir "%s" failed in PWD "%s"`, path, gfile.Pwd())
return gerror.WrapCodef(gerror.CodeOperationFailed, err, `Mkdir "%s" failed in PWD "%s"`, path, gfile.Pwd())
}
}
l.config.Path = strings.TrimRight(path, gfile.Separator)

View File

@ -77,7 +77,7 @@ func (l *Logger) SetLevelStr(levelStr string) error {
if level, ok := levelStringMap[strings.ToUpper(levelStr)]; ok {
l.config.Level = level
} else {
return gerror.Newf(`invalid level string: %s`, levelStr)
return gerror.NewCodef(gerror.CodeInvalidParameter, `invalid level string: %s`, levelStr)
}
return nil
}

View File

@ -65,7 +65,7 @@ func getConnByPid(pid int) (*gtcp.PoolConn, error) {
return nil, err
}
}
return nil, gerror.Newf("could not find port for pid: %d", pid)
return nil, gerror.NewCodef(gerror.CodeOperationFailed, "could not find port for pid: %d", pid)
}
// getPortByPid returns the listening port for specified pid.

View File

@ -43,8 +43,7 @@ func Send(pid int, data []byte, group ...string) error {
})
if len(result) > 0 {
response := new(MsgResponse)
err = json.UnmarshalUseNumber(result, response)
if err == nil {
if err = json.UnmarshalUseNumber(result, response); err == nil {
if response.Code != 1 {
err = gerror.New(response.Message)
}

View File

@ -101,7 +101,7 @@ func (p *Process) Send(data []byte) error {
if p.Process != nil {
return Send(p.Process.Pid, data)
}
return gerror.New("invalid process")
return gerror.NewCode(gerror.CodeInvalidParameter, "invalid process")
}
// Release releases any resources associated with the Process p,

View File

@ -69,7 +69,7 @@ func Jobs() int {
// The job will be executed asynchronously.
func (p *Pool) Add(f func()) error {
for p.closed.Val() {
return gerror.New("pool closed")
return gerror.NewCode(gerror.CodeInvalidOperation, "pool closed")
}
p.list.PushFront(f)
// Check whether fork new goroutine or not.
@ -96,9 +96,13 @@ func (p *Pool) Add(f func()) error {
func (p *Pool) AddWithRecover(userFunc func(), recoverFunc ...func(err error)) error {
return p.Add(func() {
defer func() {
if err := recover(); err != nil {
if exception := recover(); exception != nil {
if len(recoverFunc) > 0 && recoverFunc[0] != nil {
recoverFunc[0](gerror.Newf(`%v`, err))
if err, ok := exception.(error); ok {
recoverFunc[0](err)
} else {
recoverFunc[0](gerror.NewCodef(gerror.CodeInternalError, `%v`, exception))
}
}
}
}()

View File

@ -8,12 +8,15 @@
package gsession
import (
"errors"
"github.com/gogf/gf/errors/gerror"
"github.com/gogf/gf/util/guid"
)
var (
ErrorDisabled = errors.New("this feature is disabled in this storage")
ErrorDisabled = gerror.NewOption(gerror.Option{
Text: "this feature is disabled in this storage",
Code: gerror.CodeNotSupported,
})
)
// NewSessionId creates and returns a new and unique session id string,

View File

@ -182,7 +182,7 @@ func (s *Session) Id() string {
// It returns error if it is called after session starts.
func (s *Session) SetId(id string) error {
if s.start {
return gerror.New("session already started")
return gerror.NewCode(gerror.CodeInvalidOperation, "session already started")
}
s.id = id
return nil
@ -192,7 +192,7 @@ func (s *Session) SetId(id string) error {
// It returns error if it is called after session starts.
func (s *Session) SetIdFunc(f func(ttl time.Duration) string) error {
if s.start {
return gerror.New("session already started")
return gerror.NewCode(gerror.CodeInvalidOperation, "session already started")
}
s.idFunc = f
return nil

View File

@ -48,15 +48,15 @@ func NewStorageFile(path ...string) *StorageFile {
if len(path) > 0 && path[0] != "" {
storagePath, _ = gfile.Search(path[0])
if storagePath == "" {
panic(gerror.Newf("'%s' does not exist", path[0]))
panic(gerror.NewCodef(gerror.CodeInvalidParameter, `"%s" does not exist`, path[0]))
}
if !gfile.IsWritable(storagePath) {
panic(gerror.Newf("'%s' is not writable", path[0]))
panic(gerror.NewCodef(gerror.CodeInvalidParameter, `"%s" is not writable`, path[0]))
}
}
if storagePath != "" {
if err := gfile.Mkdir(storagePath); err != nil {
panic(gerror.Wrapf(err, `Mkdir "%s" failed in PWD "%s"`, path, gfile.Pwd()))
panic(gerror.WrapCodef(gerror.CodeInternalError, err, `Mkdir "%s" failed in PWD "%s"`, path, gfile.Pwd()))
}
}
s := &StorageFile{

View File

@ -103,7 +103,7 @@ func (sp *SPath) Set(path string) (realPath string, err error) {
}
}
if realPath == "" {
return realPath, gerror.Newf(`path "%s" does not exist`, path)
return realPath, gerror.NewCodef(gerror.CodeInvalidParameter, `path "%s" does not exist`, path)
}
// The set path must be a directory.
if gfile.IsDir(realPath) {
@ -123,7 +123,7 @@ func (sp *SPath) Set(path string) (realPath string, err error) {
sp.addMonitorByPath(realPath)
return realPath, nil
} else {
return "", gerror.New(path + " should be a folder")
return "", gerror.NewCode(gerror.CodeInvalidParameter, path+" should be a folder")
}
}
@ -138,7 +138,7 @@ func (sp *SPath) Add(path string) (realPath string, err error) {
}
}
if realPath == "" {
return realPath, gerror.Newf(`path "%s" does not exist`, path)
return realPath, gerror.NewCodef(gerror.CodeInvalidParameter, `path "%s" does not exist`, path)
}
// The added path must be a directory.
if gfile.IsDir(realPath) {
@ -152,7 +152,7 @@ func (sp *SPath) Add(path string) (realPath string, err error) {
}
return realPath, nil
} else {
return "", gerror.New(path + " should be a folder")
return "", gerror.NewCode(gerror.CodeInvalidParameter, path+" should be a folder")
}
}

View File

@ -276,7 +276,7 @@ func StrToTime(str string, format ...string) (*Time, error) {
}
return NewFromTime(time.Date(0, time.Month(1), 1, hour, min, sec, nsec, local)), nil
} else {
return nil, gerror.New("unsupported time format")
return nil, gerror.NewCode(gerror.CodeInvalidParameter, "unsupported time format")
}
// Time
@ -311,7 +311,7 @@ func StrToTime(str string, format ...string) (*Time, error) {
m, _ := strconv.Atoi(zone[2:4])
s, _ := strconv.Atoi(zone[4:6])
if h > 24 || m > 59 || s > 59 {
return nil, gerror.Newf("invalid zone string: %s", match[6])
return nil, gerror.NewCodef(gerror.CodeInvalidParameter, "invalid zone string: %s", match[6])
}
// Comparing the given time zone whether equals to current time zone,
// it converts it to UTC if they does not equal.
@ -350,7 +350,7 @@ func StrToTime(str string, format ...string) (*Time, error) {
}
}
if month <= 0 || day <= 0 {
return nil, gerror.New("invalid time string:" + str)
return nil, gerror.NewCodef(gerror.CodeInvalidParameter, "invalid time string:%s", str)
}
return NewFromTime(time.Date(year, time.Month(month), day, hour, min, sec, nsec, local)), nil
}

View File

@ -462,7 +462,7 @@ func (t *Time) UnmarshalText(data []byte) error {
*t = *vTime
return nil
}
return gerror.Newf(`invalid time value: %s`, data)
return gerror.NewCodef(gerror.CodeInvalidParameter, `invalid time value: %s`, data)
}
// NoValidation marks this struct object will not be validated by package gvalid.

View File

@ -74,7 +74,7 @@ func (view *View) SetConfig(config Config) error {
// SetConfigWithMap set configurations with map for the view.
func (view *View) SetConfigWithMap(m map[string]interface{}) error {
if m == nil || len(m) == 0 {
return gerror.New("configuration cannot be empty")
return gerror.NewCode(gerror.CodeInvalidParameter, "configuration cannot be empty")
}
// The m now is a shallow copy of m.
// Any changes to m does not affect the original one.
@ -123,7 +123,7 @@ func (view *View) SetPath(path string) error {
}
// Path not exist.
if realPath == "" {
err := gerror.Newf(`[gview] SetPath failed: path "%s" does not exist`, path)
err := gerror.NewCodef(gerror.CodeInvalidParameter, `[gview] SetPath failed: path "%s" does not exist`, path)
if errorPrint() {
glog.Error(err)
}
@ -131,7 +131,7 @@ func (view *View) SetPath(path string) error {
}
// Should be a directory.
if !isDir {
err := gerror.Newf(`[gview] SetPath failed: path "%s" should be directory type`, path)
err := gerror.NewCodef(gerror.CodeInvalidParameter, `[gview] SetPath failed: path "%s" should be directory type`, path)
if errorPrint() {
glog.Error(err)
}
@ -177,7 +177,7 @@ func (view *View) AddPath(path string) error {
}
// Path not exist.
if realPath == "" {
err := gerror.Newf(`[gview] AddPath failed: path "%s" does not exist`, path)
err := gerror.NewCodef(gerror.CodeInvalidParameter, `[gview] AddPath failed: path "%s" does not exist`, path)
if errorPrint() {
glog.Error(err)
}
@ -185,7 +185,7 @@ func (view *View) AddPath(path string) error {
}
// realPath should be type of folder.
if !isDir {
err := gerror.Newf(`[gview] AddPath failed: path "%s" should be directory type`, path)
err := gerror.NewCodef(gerror.CodeInvalidParameter, `[gview] AddPath failed: path "%s" should be directory type`, path)
if errorPrint() {
glog.Error(err)
}

View File

@ -112,7 +112,7 @@ func (view *View) Parse(ctx context.Context, file string, params ...Params) (res
tpl, err = tpl.(*texttpl.Template).Parse(item.content)
}
if err != nil && item.path != "" {
err = gerror.Wrap(err, item.path)
err = gerror.WrapCode(gerror.CodeInternalError, err, item.path)
}
})
if err != nil {
@ -298,7 +298,7 @@ func (view *View) getTemplate(filePath, folderPath, pattern string) (tpl interfa
// formatTemplateObjectCreatingError formats the error that creted from creating template object.
func (view *View) formatTemplateObjectCreatingError(filePath, tplName string, err error) error {
if err != nil {
return gerror.NewSkip(1, gstr.Replace(err.Error(), tplName, filePath))
return gerror.NewCodeSkip(gerror.CodeInternalError, 1, gstr.Replace(err.Error(), tplName, filePath))
}
return nil
}
@ -376,7 +376,7 @@ func (view *View) searchFile(file string) (path string, folder string, resource
if errorPrint() {
glog.Error(buffer.String())
}
err = gerror.Newf(`template file "%s" not found`, file)
err = gerror.NewCodef(gerror.CodeInvalidParameter, `template file "%s" not found`, file)
}
return
}

View File

@ -86,7 +86,7 @@ func doMapToMap(params interface{}, pointer interface{}, mapping ...map[string]s
pointerKind = pointerRv.Kind()
}
if pointerKind != reflect.Map {
return gerror.Newf("pointer should be type of *map, but got:%s", pointerKind)
return gerror.NewCodef(gerror.CodeInvalidParameter, "pointer should be type of *map, but got:%s", pointerKind)
}
defer func() {
// Catch the panic, especially the reflect operation panics.
@ -94,7 +94,7 @@ func doMapToMap(params interface{}, pointer interface{}, mapping ...map[string]s
if e, ok := exception.(errorStack); ok {
err = e
} else {
err = gerror.NewSkipf(1, "%v", exception)
err = gerror.NewCodeSkipf(gerror.CodeInternalError, 1, "%v", exception)
}
}
}()

View File

@ -73,7 +73,7 @@ func doMapToMaps(params interface{}, pointer interface{}, mapping ...map[string]
paramsKind = paramsRv.Kind()
}
if paramsKind != reflect.Array && paramsKind != reflect.Slice {
return gerror.New("params should be type of slice, eg: []map/[]*map/[]struct/[]*struct")
return gerror.NewCode(gerror.CodeInvalidParameter, "params should be type of slice, eg: []map/[]*map/[]struct/[]*struct")
}
var (
paramsElem = paramsRv.Type().Elem()
@ -84,7 +84,7 @@ func doMapToMaps(params interface{}, pointer interface{}, mapping ...map[string]
paramsElemKind = paramsElem.Kind()
}
if paramsElemKind != reflect.Map && paramsElemKind != reflect.Struct && paramsElemKind != reflect.Interface {
return gerror.Newf("params element should be type of map/*map/struct/*struct, but got: %s", paramsElemKind)
return gerror.NewCodef(gerror.CodeInvalidParameter, "params element should be type of map/*map/struct/*struct, but got: %s", paramsElemKind)
}
// Empty slice, no need continue.
if paramsRv.Len() == 0 {
@ -100,7 +100,7 @@ func doMapToMaps(params interface{}, pointer interface{}, mapping ...map[string]
pointerKind = pointerRv.Kind()
}
if pointerKind != reflect.Array && pointerKind != reflect.Slice {
return gerror.New("pointer should be type of *[]map/*[]*map")
return gerror.NewCode(gerror.CodeInvalidParameter, "pointer should be type of *[]map/*[]*map")
}
var (
pointerElemType = pointerRv.Type().Elem()
@ -110,7 +110,7 @@ func doMapToMaps(params interface{}, pointer interface{}, mapping ...map[string]
pointerElemKind = pointerElemType.Elem().Kind()
}
if pointerElemKind != reflect.Map {
return gerror.New("pointer element should be type of map/*map")
return gerror.NewCode(gerror.CodeInvalidParameter, "pointer element should be type of map/*map")
}
defer func() {
// Catch the panic, especially the reflect operation panics.
@ -118,7 +118,7 @@ func doMapToMaps(params interface{}, pointer interface{}, mapping ...map[string]
if e, ok := exception.(errorStack); ok {
err = e
} else {
err = gerror.NewSkipf(1, "%v", exception)
err = gerror.NewCodeSkipf(gerror.CodeInternalError, 1, "%v", exception)
}
}
}()

View File

@ -23,7 +23,7 @@ func Scan(params interface{}, pointer interface{}, mapping ...map[string]string)
pointerKind = pointerType.Kind()
)
if pointerKind != reflect.Ptr {
return gerror.Newf("params should be type of pointer, but got: %v", pointerKind)
return gerror.NewCodef(gerror.CodeInvalidParameter, "params should be type of pointer, but got: %v", pointerKind)
}
var (
pointerElem = pointerType.Elem()
@ -60,7 +60,7 @@ func ScanDeep(params interface{}, pointer interface{}, mapping ...map[string]str
t := reflect.TypeOf(pointer)
k := t.Kind()
if k != reflect.Ptr {
return gerror.Newf("params should be type of pointer, but got: %v", k)
return gerror.NewCodef(gerror.CodeInvalidParameter, "params should be type of pointer, but got: %v", k)
}
switch t.Elem().Kind() {
case reflect.Array, reflect.Slice:

View File

@ -7,7 +7,6 @@
package gconv
import (
"fmt"
"github.com/gogf/gf/errors/gerror"
"github.com/gogf/gf/internal/empty"
"github.com/gogf/gf/internal/json"
@ -63,7 +62,7 @@ func doStruct(params interface{}, pointer interface{}, mapping map[string]string
return nil
}
if pointer == nil {
return gerror.New("object pointer cannot be nil")
return gerror.NewCode(gerror.CodeInvalidParameter, "object pointer cannot be nil")
}
defer func() {
@ -72,7 +71,7 @@ func doStruct(params interface{}, pointer interface{}, mapping map[string]string
if e, ok := exception.(errorStack); ok {
err = e
} else {
err = gerror.NewSkipf(1, "%v", exception)
err = gerror.NewCodeSkipf(gerror.CodeInternalError, 1, "%v", exception)
}
}
}()
@ -125,11 +124,11 @@ func doStruct(params interface{}, pointer interface{}, mapping map[string]string
pointerReflectValue = reflect.ValueOf(pointer)
pointerReflectKind = pointerReflectValue.Kind()
if pointerReflectKind != reflect.Ptr {
return gerror.Newf("object pointer should be type of '*struct', but got '%v'", pointerReflectKind)
return gerror.NewCodef(gerror.CodeInvalidParameter, "object pointer should be type of '*struct', but got '%v'", pointerReflectKind)
}
// Using IsNil on reflect.Ptr variable is OK.
if !pointerReflectValue.IsValid() || pointerReflectValue.IsNil() {
return gerror.New("object pointer cannot be nil")
return gerror.NewCode(gerror.CodeInvalidParameter, "object pointer cannot be nil")
}
pointerElemReflectValue = pointerReflectValue.Elem()
}
@ -167,7 +166,7 @@ func doStruct(params interface{}, pointer interface{}, mapping map[string]string
// DO NOT use MapDeep here.
paramsMap := Map(paramsInterface)
if paramsMap == nil {
return gerror.Newf("convert params to map failed: %v", params)
return gerror.NewCodef(gerror.CodeInvalidParameter, "convert params to map failed: %v", params)
}
// It only performs one converting to the same attribute.
@ -308,7 +307,7 @@ func bindVarToStructAttr(elem reflect.Value, name string, value interface{}, map
defer func() {
if exception := recover(); exception != nil {
if err = bindVarToReflectValue(structFieldValue, value, mapping, priorityTag); err != nil {
err = gerror.Wrapf(err, `error binding value to attribute "%s"`, name)
err = gerror.WrapCodef(gerror.CodeInternalError, err, `error binding value to attribute "%s"`, name)
}
}
}()
@ -461,12 +460,12 @@ func bindVarToReflectValue(structFieldValue reflect.Value, value interface{}, ma
default:
defer func() {
if exception := recover(); exception != nil {
err = gerror.New(
fmt.Sprintf(`cannot convert value "%+v" to type "%s":%+v`,
value,
structFieldValue.Type().String(),
exception,
),
err = gerror.NewCodef(
gerror.CodeInternalError,
`cannot convert value "%+v" to type "%s":%+v`,
value,
structFieldValue.Type().String(),
exception,
)
}
}()

View File

@ -51,7 +51,7 @@ func doStructs(params interface{}, pointer interface{}, mapping map[string]strin
return nil
}
if pointer == nil {
return gerror.New("object pointer cannot be nil")
return gerror.NewCode(gerror.CodeInvalidParameter, "object pointer cannot be nil")
}
if doStructsByDirectReflectSet(params, pointer) {
@ -64,7 +64,7 @@ func doStructs(params interface{}, pointer interface{}, mapping map[string]strin
if e, ok := exception.(errorStack); ok {
err = e
} else {
err = gerror.NewSkipf(1, "%v", exception)
err = gerror.NewCodeSkipf(gerror.CodeInternalError, 1, "%v", exception)
}
}
}()
@ -96,7 +96,7 @@ func doStructs(params interface{}, pointer interface{}, mapping map[string]strin
if !ok {
pointerRv = reflect.ValueOf(pointer)
if kind := pointerRv.Kind(); kind != reflect.Ptr {
return gerror.Newf("pointer should be type of pointer, but got: %v", kind)
return gerror.NewCodef(gerror.CodeInvalidParameter, "pointer should be type of pointer, but got: %v", kind)
}
}
// Converting `params` to map slice.

View File

@ -7,7 +7,7 @@
package gvalid
import (
"errors"
"github.com/gogf/gf/errors/gerror"
"github.com/gogf/gf/text/gregex"
"github.com/gogf/gf/text/gstr"
"strings"
@ -15,6 +15,7 @@ import (
// Error is the validation error for validation result.
type Error interface {
Code() int
Current() error
Error() string
FirstItem() (key string, messages map[string]string)
@ -29,6 +30,7 @@ type Error interface {
// validationError is the validation error for validation result.
type validationError struct {
code int // Error code.
rules []string // Rules by sequence, which is used for keeping error sequence.
errors map[string]map[string]string // Error map:map[field]map[rule]message
firstKey string // The first error rule key(empty in default).
@ -36,7 +38,7 @@ type validationError struct {
}
// newError creates and returns a validation error.
func newError(rules []string, errors map[string]map[string]string) *validationError {
func newError(code int, rules []string, errors map[string]map[string]string) *validationError {
for field, m := range errors {
for k, v := range m {
v = strings.Replace(v, ":attribute", field, -1)
@ -47,6 +49,7 @@ func newError(rules []string, errors map[string]map[string]string) *validationEr
errors[field] = m
}
return &validationError{
code: code,
rules: rules,
errors: errors,
}
@ -54,13 +57,21 @@ func newError(rules []string, errors map[string]map[string]string) *validationEr
// newErrorStr creates and returns a validation error by string.
func newErrorStr(key, err string) *validationError {
return newError(nil, map[string]map[string]string{
return newError(gerror.CodeInternalError, nil, map[string]map[string]string{
internalErrorMapKey: {
key: err,
},
})
}
// Code returns the error code of current validation error.
func (e *validationError) Code() int {
if e == nil {
return gerror.CodeNil
}
return e.code
}
// Map returns the first error message as map.
func (e *validationError) Map() map[string]string {
if e == nil {
@ -179,7 +190,7 @@ func (e *validationError) Current() error {
return nil
}
_, err := e.FirstRule()
return errors.New(err)
return gerror.NewCode(e.code, err)
}
// String returns all error messages as string, multiple error messages joined using char ';'.

View File

@ -7,6 +7,7 @@
package gvalid
import (
"github.com/gogf/gf/errors/gerror"
"github.com/gogf/gf/util/gconv"
"strings"
)
@ -130,7 +131,7 @@ func (v *Validator) doCheckMap(params interface{}) Error {
}
}
if len(errorMaps) > 0 {
return newError(errorRules, errorMaps)
return newError(gerror.CodeValidationFailed, errorRules, errorMaps)
}
return nil
}

View File

@ -7,6 +7,7 @@
package gvalid
import (
"github.com/gogf/gf/errors/gerror"
"github.com/gogf/gf/internal/structs"
"github.com/gogf/gf/util/gconv"
"github.com/gogf/gf/util/gutil"
@ -249,7 +250,7 @@ func (v *Validator) doCheckStruct(object interface{}) Error {
}
}
if len(errorMaps) > 0 {
return newError(errorRules, errorMaps)
return newError(gerror.CodeValidationFailed, errorRules, errorMaps)
}
return nil
}

View File

@ -7,7 +7,7 @@
package gvalid
import (
"errors"
"github.com/gogf/gf/errors/gerror"
"strconv"
"strings"
"time"
@ -138,7 +138,7 @@ func (v *Validator) doCheckValue(
index++
}
if len(errorMsgArray) > 0 {
return newError([]string{rules}, map[string]map[string]string{
return newError(gerror.CodeValidationFailed, []string{rules}, map[string]map[string]string{
key: errorMsgArray,
})
}
@ -175,7 +175,10 @@ func (v *Validator) doCheckBuildInRules(
"max-length",
"size":
if msg := v.checkLength(valueStr, ruleKey, rulePattern, customMsgMap); msg != "" {
return match, errors.New(msg)
return match, gerror.NewOption(gerror.Option{
Text: msg,
Code: gerror.CodeValidationFailed,
})
} else {
match = true
}
@ -186,7 +189,10 @@ func (v *Validator) doCheckBuildInRules(
"max",
"between":
if msg := v.checkRange(valueStr, ruleKey, rulePattern, customMsgMap); msg != "" {
return match, errors.New(msg)
return match, gerror.NewOption(gerror.Option{
Text: msg,
Code: gerror.CodeValidationFailed,
})
} else {
match = true
}
@ -222,7 +228,10 @@ func (v *Validator) doCheckBuildInRules(
var msg string
msg = v.getErrorMessageByRule(ruleKey, customMsgMap)
msg = strings.Replace(msg, ":format", rulePattern, -1)
return match, errors.New(msg)
return match, gerror.NewOption(gerror.Option{
Text: msg,
Code: gerror.CodeValidationFailed,
})
}
// Values of two fields should be equal as string.
@ -237,7 +246,10 @@ func (v *Validator) doCheckBuildInRules(
var msg string
msg = v.getErrorMessageByRule(ruleKey, customMsgMap)
msg = strings.Replace(msg, ":field", rulePattern, -1)
return match, errors.New(msg)
return match, gerror.NewOption(gerror.Option{
Text: msg,
Code: gerror.CodeValidationFailed,
})
}
// Values of two fields should not be equal as string.
@ -253,7 +265,10 @@ func (v *Validator) doCheckBuildInRules(
var msg string
msg = v.getErrorMessageByRule(ruleKey, customMsgMap)
msg = strings.Replace(msg, ":field", rulePattern, -1)
return match, errors.New(msg)
return match, gerror.NewOption(gerror.Option{
Text: msg,
Code: gerror.CodeValidationFailed,
})
}
// Field value should be in range of.
@ -436,7 +451,10 @@ func (v *Validator) doCheckBuildInRules(
match = gregex.IsMatchString(`^([0-9A-Fa-f]{2}[\-:]){5}[0-9A-Fa-f]{2}$`, valueStr)
default:
return match, errors.New("Invalid rule name: " + ruleKey)
return match, gerror.NewOption(gerror.Option{
Text: "Invalid rule name: " + ruleKey,
Code: gerror.CodeInvalidParameter,
})
}
return match, nil
}

View File

@ -1014,3 +1014,16 @@ func Test_InternalError_String(t *testing.T) {
t.Assert(gerror.Current(err), "InvalidRules: hh")
})
}
func Test_Code(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
err := g.Validator().Rules("required").CheckValue("")
t.AssertNE(err, nil)
t.Assert(gerror.Code(err), gerror.CodeValidationFailed)
})
gtest.C(t, func(t *gtest.T) {
err := g.Validator().Rules("none-exist-rule").CheckValue("")
t.AssertNE(err, nil)
t.Assert(gerror.Code(err), gerror.CodeInternalError)
})
}