auto commit

master
李伟乐 11 months ago
parent ff91b9782b
commit 48f78863a4
  1. 2
      Makefile
  2. 3
      app.go
  3. 2
      cmd/mysql-kit/main.go
  4. 2
      core/errorx/batcherror.go
  5. 2
      core/errorx/errors.go
  6. 2
      core/errorx/errors.pb.go
  7. 0
      core/errorx/errors.proto
  8. 2
      core/errorx/types.go
  9. 2
      core/errorx/warp.go
  10. 2
      core/gox/gox.go
  11. 2
      core/logx/filter.go
  12. 2
      core/logx/filter_test.go
  13. 2
      core/logx/global.go
  14. 2
      core/logx/global_test.go
  15. 2
      core/logx/helper.go
  16. 2
      core/logx/helper_test.go
  17. 2
      core/logx/level.go
  18. 2
      core/logx/log.go
  19. 2
      core/logx/log_test.go
  20. 18
      core/logx/nsq_test.go
  21. 10
      core/logx/nsqwriter.go
  22. 2
      core/logx/std.go
  23. 2
      core/logx/value.go
  24. 4
      core/mapping/mapping.go
  25. 0
      core/pathx/file.go
  26. 0
      core/pathx/file_test.go
  27. 3
      core/syncx/resourcemanager.go
  28. 11
      core/timex/repr.go
  29. 73
      core/timex/ticker.go
  30. 65
      internal/encoding/encoding.go
  31. 34
      internal/endpoint/endpoint.go
  32. 126
      internal/endpoint/endpoint_test.go
  33. 71
      lang/lang.go
  34. 19
      log/mq/nsq_test.go
  35. 3
      middleware/jwt/default.go
  36. 5
      middleware/jwt/jwt.go
  37. 17
      middleware/jwt/token.go
  38. 3
      middleware/logger.go
  39. 3
      middleware/prome/prome.go
  40. 3
      middleware/validate/validate.go
  41. 5
      options.go
  42. 221
      proto/v1/user.pb.go
  43. 239
      proto/v1/user.pb.validate.go
  44. 15
      proto/v1/user.ts
  45. 109
      proto/v1/user_grpc.pb.go
  46. 14
      proto/v1/user_http.pb.go
  47. 3
      response/response.go
  48. 3
      selector/selector.go
  49. 5
      transport/http/binding/bind.go
  50. 7
      transport/http/client.go
  51. 9
      transport/http/codec.go
  52. 7
      transport/http/server.go
  53. 15
      user.ts

@ -21,7 +21,7 @@ gen:
protoc -I ./third_party -I ./proto --ts_out=prefix=/api/v1/sendmail:./api --go_out=./api --go-grpc_out=./api --kit_out=./api --validate_out="lang=go:./api" ./proto/*.proto protoc -I ./third_party -I ./proto --ts_out=prefix=/api/v1/sendmail:./api --go_out=./api --go-grpc_out=./api --kit_out=./api --validate_out="lang=go:./api" ./proto/*.proto
auth: auth:
protoc --go_out=. ./third_party/auth/auth.proto protoc --go_out=. ./third_party/auth/auth.proto
gitpush: git:
git add . git add .
git commit -m "auto commit" git commit -m "auto commit"
git push git push

@ -7,7 +7,6 @@ import (
_ "git.diulo.com/mogfee/kit/encoding/form" _ "git.diulo.com/mogfee/kit/encoding/form"
_ "git.diulo.com/mogfee/kit/encoding/json" _ "git.diulo.com/mogfee/kit/encoding/json"
_ "git.diulo.com/mogfee/kit/encoding/xml" _ "git.diulo.com/mogfee/kit/encoding/xml"
"git.diulo.com/mogfee/kit/log"
"git.diulo.com/mogfee/kit/registry" "git.diulo.com/mogfee/kit/registry"
"git.diulo.com/mogfee/kit/transport" "git.diulo.com/mogfee/kit/transport"
"github.com/google/uuid" "github.com/google/uuid"
@ -50,7 +49,7 @@ func New(opts ...Option) *App {
} }
fmt.Println(o.id) fmt.Println(o.id)
if o.logger != nil { if o.logger != nil {
log.SetLogger(o.logger) logx.SetLogger(o.logger)
} }
ctx, cancel := context.WithCancel(o.ctx) ctx, cancel := context.WithCancel(o.ctx)
return &App{ return &App{

@ -5,8 +5,8 @@ import (
"flag" "flag"
"fmt" "fmt"
"git.diulo.com/mogfee/kit/cmd/mysql-kit/core" "git.diulo.com/mogfee/kit/cmd/mysql-kit/core"
"git.diulo.com/mogfee/kit/core/pathx"
"git.diulo.com/mogfee/kit/mysql/ddl" "git.diulo.com/mogfee/kit/mysql/ddl"
"git.diulo.com/mogfee/kit/pathx"
"os" "os"
"os/exec" "os/exec"
"strings" "strings"

@ -1,4 +1,4 @@
package errors package errorx
import "bytes" import "bytes"

@ -1,4 +1,4 @@
package errors package errorx
import ( import (
"errors" "errors"

@ -4,7 +4,7 @@
// protoc v4.22.0 // protoc v4.22.0
// source: errors.proto // source: errors.proto
package errors package errorx
import ( import (
protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoreflect "google.golang.org/protobuf/reflect/protoreflect"

@ -1,5 +1,5 @@
// nolint:gomnd // nolint:gomnd
package errors package errorx
// BadRequest new BadRequest error that is mapped to a 400 response. // BadRequest new BadRequest error that is mapped to a 400 response.
func BadRequest(reason, message string) *Error { func BadRequest(reason, message string) *Error {

@ -1,4 +1,4 @@
package errors package errorx
import ( import (
stderrors "errors" stderrors "errors"

@ -1,4 +1,4 @@
package xgo package gox
import "fmt" import "fmt"

@ -1,4 +1,4 @@
package log package logx
type FilterOption func(*Filter) type FilterOption func(*Filter)

@ -1,4 +1,4 @@
package log package logx
import ( import (
"testing" "testing"

@ -1,4 +1,4 @@
package log package logx
import ( import (
"context" "context"

@ -1,4 +1,4 @@
package log package logx
import ( import (
"testing" "testing"

@ -1,4 +1,4 @@
package log package logx
import ( import (
"context" "context"

@ -1,4 +1,4 @@
package log package logx
import "testing" import "testing"

@ -1,4 +1,4 @@
package log package logx
import "strings" import "strings"

@ -1,4 +1,4 @@
package log package logx
import ( import (
"context" "context"

@ -1,4 +1,4 @@
package log package logx
import ( import (
"testing" "testing"

@ -0,0 +1,18 @@
package logx
import (
"context"
"fmt"
"testing"
)
func Test_nsqLogger_Log(t *testing.T) {
nsqWriter := NewNsqLogger("localhost:4150", "app_log")
nsqWriter.Start(context.Background())
logger := With(nsqWriter,
"ts", DefaultTimestamp,
"caller", DefaultCaller,
)
logger.Log(LevelInfo, "user name ttt")
fmt.Println(nsqWriter.Stop(context.Background()))
}

@ -1,11 +1,10 @@
package mq package logx
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"git.diulo.com/mogfee/kit/log" "git.diulo.com/mogfee/kit/core/gox"
"git.diulo.com/mogfee/kit/xgo"
"github.com/nsqio/go-nsq" "github.com/nsqio/go-nsq"
"sync" "sync"
"sync/atomic" "sync/atomic"
@ -20,12 +19,11 @@ type nsqLogger struct {
} }
func (s *nsqLogger) Start(ctx context.Context) error { func (s *nsqLogger) Start(ctx context.Context) error {
xgo.Go(func() { gox.Go(func() {
for v := range s.list { for v := range s.list {
if s.stop.Load() { if s.stop.Load() {
break break
} }
fmt.Println(string(v))
func(v []byte) { func(v []byte) {
s.wg.Add(1) s.wg.Add(1)
defer s.wg.Done() defer s.wg.Done()
@ -66,7 +64,7 @@ func NewNsqLogger(host string, topic string) *nsqLogger {
return std return std
} }
func (l *nsqLogger) Log(level log.Level, keyvals ...any) error { func (l *nsqLogger) Log(level Level, keyvals ...any) error {
if l.stop.Load() { if l.stop.Load() {
fmt.Println("log is stop") fmt.Println("log is stop")
return nil return nil

@ -1,4 +1,4 @@
package log package logx
import ( import (
"bytes" "bytes"

@ -1,4 +1,4 @@
package log package logx
import ( import (
"context" "context"

@ -3,7 +3,6 @@ package mapping
import ( import (
"errors" "errors"
"fmt" "fmt"
"git.diulo.com/mogfee/kit/lang"
"reflect" "reflect"
"sync" "sync"
) )
@ -47,6 +46,3 @@ func ValidatePtr(v *reflect.Value) error {
} }
return nil return nil
} }
func Repr(v any) string {
return lang.Repr(v)
}

@ -1,7 +1,6 @@
package syncx package syncx
import ( import (
"git.diulo.com/mogfee/kit/errors"
"io" "io"
"sync" "sync"
) )
@ -21,7 +20,7 @@ func NewResourceManager() *ResourceManager {
func (manager *ResourceManager) Close() error { func (manager *ResourceManager) Close() error {
manager.lock.Lock() manager.lock.Lock()
defer manager.lock.Unlock() defer manager.lock.Unlock()
var be errors.BatchError var be errorx.BatchError
for _, resource := range manager.resource { for _, resource := range manager.resource {
if err := resource.Close(); err != nil { if err := resource.Close(); err != nil {
be.Add(err) be.Add(err)

@ -1,11 +0,0 @@
package timex
import (
"fmt"
"time"
)
// ReprOfDuration returns the string representation of given duration in ms.
func ReprOfDuration(duration time.Duration) string {
return fmt.Sprintf("%.1fms", float32(duration)/float32(time.Millisecond))
}

@ -1,73 +0,0 @@
package timex
import (
"errors"
"git.diulo.com/mogfee/kit/lang"
"time"
)
var errTimeout = errors.New("timeout")
type (
Ticker interface {
Chan() <-chan time.Time
Stop()
}
FakeTicker interface {
Ticker
Done()
Tick()
Wait(d time.Duration) error
}
fakeTicker struct {
c chan time.Time
done chan lang.PlaceholderType
}
realTicker struct {
*time.Ticker
}
)
func NewTicker(d time.Duration) Ticker {
return &realTicker{
Ticker: time.NewTicker(d),
}
}
func (r *realTicker) Chan() <-chan time.Time {
return r.C
}
func NewFakeTicker() FakeTicker {
return &fakeTicker{
c: make(chan time.Time, 1),
done: make(chan lang.PlaceholderType, 1),
}
}
func (f *fakeTicker) Chan() <-chan time.Time {
return f.c
}
func (f *fakeTicker) Stop() {
close(f.c)
}
func (f *fakeTicker) Done() {
f.done <- lang.Placeholder
}
func (f *fakeTicker) Tick() {
f.c <- time.Now()
}
func (f *fakeTicker) Wait(d time.Duration) error {
select {
case <-time.After(d):
return errTimeout
case <-f.done:
return nil
}
}

@ -1,65 +0,0 @@
package encoding
import (
"bytes"
"encoding/json"
"git.diulo.com/mogfee/kit/lang"
"github.com/pelletier/go-toml/v2"
"gopkg.in/yaml.v3"
)
func TomlToJson(data []byte) ([]byte, error) {
var val any
if err := toml.NewDecoder(bytes.NewReader(data)).Decode(&val); err != nil {
return nil, err
}
var buf bytes.Buffer
if err := json.NewEncoder(&buf).Encode(val); err != nil {
return nil, err
}
return buf.Bytes(), nil
}
func YamlToJson(data []byte) ([]byte, error) {
var val any
if err := yaml.Unmarshal(data, &val); err != nil {
return nil, err
}
val = toStringKeyMap(val)
var buf bytes.Buffer
if err := json.NewEncoder(&buf).Encode(val); err != nil {
return nil, err
}
return buf.Bytes(), nil
}
func convertKeyToString(in map[any]any) map[string]any {
res := make(map[string]any)
for k, v := range in {
res[lang.Repr(k)] = toStringKeyMap(v)
}
return res
}
func convertNumberToJsonNumber(in any) json.Number {
return json.Number(lang.Repr(in))
}
func covertSlice(in []any) []any {
res := make([]any, len(in))
for i, v := range in {
res[i] = toStringKeyMap(v)
}
return res
}
func toStringKeyMap(v any) any {
switch v := v.(type) {
case []any:
return covertSlice(v)
case map[any]any:
return convertKeyToString(v)
case bool, string:
return v
case int, uint, int8, uint8, int16, uint16, int32, uint32, int64, uint64, float32, float64:
return convertNumberToJsonNumber(v)
default:
return lang.Repr(v)
}
}

@ -1,34 +0,0 @@
package endpoint
import (
"net/url"
)
// NewEndpoint new an Endpoint URL.
func NewEndpoint(scheme, host string) *url.URL {
return &url.URL{Scheme: scheme, Host: host}
}
// ParseEndpoint parses an Endpoint URL.
func ParseEndpoint(endpoints []string, scheme string) (string, error) {
for _, e := range endpoints {
u, err := url.Parse(e)
if err != nil {
return "", err
}
if u.Scheme == scheme {
return u.Host, nil
}
}
return "", nil
}
// Scheme is the scheme of endpoint url.
// examples: scheme="http",isSecure=true get "https"
func Scheme(scheme string, isSecure bool) string {
if isSecure {
return scheme + "s"
}
return scheme
}

@ -1,126 +0,0 @@
package endpoint
import (
"net/url"
"reflect"
"testing"
)
func TestNewEndpoint(t *testing.T) {
type args struct {
scheme string
host string
}
tests := []struct {
name string
args args
want *url.URL
}{
{
name: "https://github.com/go-kratos/kratos/",
args: args{"https", "github.com/go-kratos/kratos/"},
want: &url.URL{Scheme: "https", Host: "github.com/go-kratos/kratos/"},
},
{
name: "https://go-kratos.dev/",
args: args{"https", "go-kratos.dev/"},
want: &url.URL{Scheme: "https", Host: "go-kratos.dev/"},
},
{
name: "https://www.google.com/",
args: args{"https", "www.google.com/"},
want: &url.URL{Scheme: "https", Host: "www.google.com/"},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := NewEndpoint(tt.args.scheme, tt.args.host); !reflect.DeepEqual(got, tt.want) {
t.Errorf("NewEndpoint() = %v, want %v", got, tt.want)
}
})
}
}
func TestParseEndpoint(t *testing.T) {
type args struct {
endpoints []string
scheme string
}
tests := []struct {
name string
args args
want string
wantErr bool
}{
{
name: "kratos",
args: args{endpoints: []string{"https://github.com/go-kratos/kratos"}, scheme: "https"},
want: "github.com",
wantErr: false,
},
{
name: "test",
args: args{endpoints: []string{"http://go-kratos.dev/"}, scheme: "https"},
want: "",
wantErr: false,
},
{
name: "localhost:8080",
args: args{endpoints: []string{"grpcs://localhost:8080/"}, scheme: "grpcs"},
want: "localhost:8080",
wantErr: false,
},
{
name: "localhost:8081",
args: args{endpoints: []string{"grpcs://localhost:8080/"}, scheme: "grpc"},
want: "",
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := ParseEndpoint(tt.args.endpoints, tt.args.scheme)
if (err != nil) != tt.wantErr {
t.Errorf("ParseEndpoint() error = %v, wantErr %v", err, tt.wantErr)
return
}
if got != tt.want {
t.Errorf("ParseEndpoint() got = %v, want %v", got, tt.want)
}
})
}
}
func TestSchema(t *testing.T) {
tests := []struct {
schema string
secure bool
want string
}{
{
schema: "http",
secure: true,
want: "https",
},
{
schema: "http",
secure: false,
want: "http",
},
{
schema: "grpc",
secure: true,
want: "grpcs",
},
{
schema: "grpc",
secure: false,
want: "grpc",
},
}
for _, tt := range tests {
if got := Scheme(tt.schema, tt.secure); got != tt.want {
t.Errorf("Schema() = %v, want %v", got, tt.want)
}
}
}

@ -1,71 +0,0 @@
package lang
import (
"fmt"
"reflect"
"strconv"
)
var Placeholder PlaceholderType
type (
AnyType = any
PlaceholderType struct{}
)
func Repr(v any) string {
if v == nil {
return ""
}
switch vt := v.(type) {
case fmt.Stringer:
return vt.String()
}
val := reflect.ValueOf(v)
if val.Kind() == reflect.Ptr && !val.IsNil() {
val = val.Elem()
}
return reprOfValue(val)
}
func reprOfValue(val reflect.Value) string {
switch vt := val.Interface().(type) {
case bool:
return strconv.FormatBool(vt)
case error:
return vt.Error()
case float32:
return strconv.FormatFloat(float64(vt), 'f', -1, 32)
case float64:
return strconv.FormatFloat(vt, 'f', -1, 64)
case fmt.Stringer:
return vt.String()
case int:
return strconv.Itoa(vt)
case int8:
return strconv.Itoa(int(vt))
case int16:
return strconv.Itoa(int(vt))
case int32:
return strconv.Itoa(int(vt))
case int64:
return strconv.FormatInt(vt, 10)
case string:
return vt
case uint:
return strconv.FormatUint(uint64(vt), 10)
case uint8:
return strconv.FormatUint(uint64(vt), 10)
case uint16:
return strconv.FormatUint(uint64(vt), 10)
case uint32:
return strconv.FormatUint(uint64(vt), 10)
case uint64:
return strconv.FormatUint(vt, 10)
case []byte:
return string(vt)
default:
return fmt.Sprint(val.Interface())
}
}

@ -1,19 +0,0 @@
package mq
import (
"context"
"fmt"
"git.diulo.com/mogfee/kit/log"
"testing"
)
func Test_nsqLogger_Log(t *testing.T) {
nsqWriter := NewNsqLogger("localhost:4150", "app_log")
nsqWriter.Start()
logger := log.With(nsqWriter,
"ts", log.DefaultTimestamp,
"caller", log.DefaultCaller,
)
logger.Log(log.LevelInfo, "user name ttt")
fmt.Println(nsqWriter.Shutdown(context.Background()))
}

@ -2,7 +2,6 @@ package jwt
import ( import (
"context" "context"
"git.diulo.com/mogfee/kit/errors"
"git.diulo.com/mogfee/kit/transport" "git.diulo.com/mogfee/kit/transport"
"git.diulo.com/mogfee/kit/transport/http" "git.diulo.com/mogfee/kit/transport/http"
"strings" "strings"
@ -54,5 +53,5 @@ func (j *JwtDefault) Validate(ctx context.Context, permission string, permission
return nil return nil
} }
} }
return errors.Forbidden("TOKEN_PERMISSION_BAD", "权限不足") return errorx.Forbidden("TOKEN_PERMISSION_BAD", "权限不足")
} }

@ -2,7 +2,6 @@ package jwt
import ( import (
"context" "context"
"git.diulo.com/mogfee/kit/errors"
"git.diulo.com/mogfee/kit/middleware" "git.diulo.com/mogfee/kit/middleware"
) )
@ -61,7 +60,7 @@ func JWT(opts ...JwtOption) middleware.Middleware {
// 解析token // 解析token
tokenStr := cfg.validate.GetToken(ctx, cfg.fromKey) tokenStr := cfg.validate.GetToken(ctx, cfg.fromKey)
if tokenStr == "" && needAuth { if tokenStr == "" && needAuth {
return nil, errors.Unauthorized("NO_TOKEN", "") return nil, errorx.Unauthorized("NO_TOKEN", "")
} }
if tokenStr != "" { if tokenStr != "" {
@ -71,7 +70,7 @@ func JWT(opts ...JwtOption) middleware.Middleware {
return err return err
} }
if needAuth && userInfo.UserId == "" { if needAuth && userInfo.UserId == "" {
return errors.Unauthorized("TOKEN_BAD", "") return errorx.Unauthorized("TOKEN_BAD", "")
} }
if authKey != "" { if authKey != "" {
if err = cfg.validate.Validate(ctx, authKey, userInfo.Permissions); err != nil { if err = cfg.validate.Validate(ctx, authKey, userInfo.Permissions); err != nil {

@ -2,7 +2,6 @@ package jwt
import ( import (
"encoding/json" "encoding/json"
"git.diulo.com/mogfee/kit/errors"
"git.diulo.com/mogfee/kit/internal/xuuid" "git.diulo.com/mogfee/kit/internal/xuuid"
"github.com/golang-jwt/jwt/v5" "github.com/golang-jwt/jwt/v5"
"time" "time"
@ -59,16 +58,16 @@ func Parse(key string, tokenStr string) (*UserInfo, error) {
} }
str, err := Decrypt(tokenStr, []byte(key), key) str, err := Decrypt(tokenStr, []byte(key), key)
if err != nil { if err != nil {
return nil, errors.Unauthorized("TOKEN_ERROR", err.Error()) return nil, errorx.Unauthorized("TOKEN_ERROR", err.Error())
} }
token, err := jwt.Parse(str, func(token *jwt.Token) (interface{}, error) { token, err := jwt.Parse(str, func(token *jwt.Token) (interface{}, error) {
return []byte(key), nil return []byte(key), nil
}) })
if err != nil { if err != nil {
if errors.Is(err, jwt.ErrTokenExpired) { if errorx.Is(err, jwt.ErrTokenExpired) {
return nil, errors.Unauthorized("TOKEN_EXPIRED", "") return nil, errorx.Unauthorized("TOKEN_EXPIRED", "")
} }
return nil, errors.Unauthorized("TOKEN_ERROR", err.Error()) return nil, errorx.Unauthorized("TOKEN_ERROR", err.Error())
} }
if token.Valid { if token.Valid {
@ -77,11 +76,11 @@ func Parse(key string, tokenStr string) (*UserInfo, error) {
}{} }{}
b, _ := json.Marshal(token.Claims) b, _ := json.Marshal(token.Claims)
if err = json.Unmarshal(b, &row); err != nil { if err = json.Unmarshal(b, &row); err != nil {
return nil, errors.Unauthorized("TOKEN_ERROR", err.Error()) return nil, errorx.Unauthorized("TOKEN_ERROR", err.Error())
} }
return row.Info, nil return row.Info, nil
} else if errors.Is(err, jwt.ErrTokenExpired) || errors.Is(err, jwt.ErrTokenNotValidYet) { } else if errorx.Is(err, jwt.ErrTokenExpired) || errorx.Is(err, jwt.ErrTokenNotValidYet) {
return nil, errors.Unauthorized("TOKEN_EXPIRED", "") return nil, errorx.Unauthorized("TOKEN_EXPIRED", "")
} }
return nil, errors.Unauthorized("TOKEN_ERROR", "") return nil, errorx.Unauthorized("TOKEN_ERROR", "")
} }

@ -2,10 +2,9 @@ package middleware
import ( import (
"context" "context"
"git.diulo.com/mogfee/kit/log"
) )
func Logger(logger log.Logger) Middleware { func Logger(logger logx.Logger) Middleware {
//helper:=log.NewHelper(logger) //helper:=log.NewHelper(logger)
return func(handler Handler) Handler { return func(handler Handler) Handler {
return func(ctx context.Context, a any) (any, error) { return func(ctx context.Context, a any) (any, error) {

@ -3,7 +3,6 @@ package prome
import ( import (
"context" "context"
"fmt" "fmt"
"git.diulo.com/mogfee/kit/errors"
"git.diulo.com/mogfee/kit/middleware" "git.diulo.com/mogfee/kit/middleware"
"git.diulo.com/mogfee/kit/transport" "git.diulo.com/mogfee/kit/transport"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
@ -66,7 +65,7 @@ func Prometheus() middleware.Middleware {
code := "500" code := "500"
if err != nil { if err != nil {
switch aerr := err.(type) { switch aerr := err.(type) {
case *errors.Error: case *errorx.Error:
code = fmt.Sprintf("%d", aerr.Code) code = fmt.Sprintf("%d", aerr.Code)
default: default:
code = "500" code = "500"

@ -2,7 +2,6 @@ package validate
import ( import (
"context" "context"
"git.diulo.com/mogfee/kit/errors"
"git.diulo.com/mogfee/kit/middleware" "git.diulo.com/mogfee/kit/middleware"
"strings" "strings"
) )
@ -19,7 +18,7 @@ func Server() middleware.Middleware {
Reason() string Reason() string
}); ok { }); ok {
field := a.Field() field := a.Field()
return nil, errors.BadRequest("InvalidArgument", "").WithMetadata(map[string]string{ return nil, errorx.BadRequest("InvalidArgument", "").WithMetadata(map[string]string{
strings.ToLower(field[0:1]) + field[1:]: a.Reason(), strings.ToLower(field[0:1]) + field[1:]: a.Reason(),
}) })
} }

@ -2,7 +2,6 @@ package kit
import ( import (
"context" "context"
"git.diulo.com/mogfee/kit/log"
"git.diulo.com/mogfee/kit/registry" "git.diulo.com/mogfee/kit/registry"
"git.diulo.com/mogfee/kit/transport" "git.diulo.com/mogfee/kit/transport"
"net/url" "net/url"
@ -21,7 +20,7 @@ type options struct {
ctx context.Context ctx context.Context
sigs []os.Signal sigs []os.Signal
logger log.Logger logger logx.Logger
registrar registry.Registrar registrar registry.Registrar
registrarTimeout time.Duration registrarTimeout time.Duration
stopTimeout time.Duration stopTimeout time.Duration
@ -64,7 +63,7 @@ func Context(ctx context.Context) Option {
} }
// Logger with service logger. // Logger with service logger.
func Logger(logger log.Logger) Option { func Logger(logger logx.Logger) Option {
return func(o *options) { o.logger = logger } return func(o *options) { o.logger = logger }
} }

@ -1,221 +0,0 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.28.1
// protoc v3.18.1
// source: user.proto
package user
import (
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
reflect "reflect"
sync "sync"
)
const (
// Verify that this generated code is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
type Request struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
UserId int64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
UserPassword string `protobuf:"bytes,2,opt,name=user_password,json=userPassword,proto3" json:"user_password,omitempty"`
}
func (x *Request) Reset() {
*x = Request{}
if protoimpl.UnsafeEnabled {
mi := &file_user_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *Request) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Request) ProtoMessage() {}
func (x *Request) ProtoReflect() protoreflect.Message {
mi := &file_user_proto_msgTypes[0]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use Request.ProtoReflect.Descriptor instead.
func (*Request) Descriptor() ([]byte, []int) {
return file_user_proto_rawDescGZIP(), []int{0}
}
func (x *Request) GetUserId() int64 {
if x != nil {
return x.UserId
}
return 0
}
func (x *Request) GetUserPassword() string {
if x != nil {
return x.UserPassword
}
return ""
}
type Response struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// 密钥
Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"`
}
func (x *Response) Reset() {
*x = Response{}
if protoimpl.UnsafeEnabled {
mi := &file_user_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *Response) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Response) ProtoMessage() {}
func (x *Response) ProtoReflect() protoreflect.Message {
mi := &file_user_proto_msgTypes[1]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use Response.ProtoReflect.Descriptor instead.
func (*Response) Descriptor() ([]byte, []int) {
return file_user_proto_rawDescGZIP(), []int{1}
}
func (x *Response) GetToken() string {
if x != nil {
return x.Token
}
return ""
}
var File_user_proto protoreflect.FileDescriptor
var file_user_proto_rawDesc = []byte{
0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x63, 0x6f,
0x6d, 0x2e, 0x64, 0x69, 0x75, 0x6c, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x22, 0x47, 0x0a, 0x07, 0x72,
0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69,
0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12,
0x23, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64,
0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x50, 0x61, 0x73, 0x73,
0x77, 0x6f, 0x72, 0x64, 0x22, 0x20, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x32, 0x41, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x39,
0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x69, 0x75,
0x6c, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17,
0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x69, 0x75, 0x6c, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72,
0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x09, 0x5a, 0x07, 0x2e, 0x2f, 0x3b,
0x75, 0x73, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
file_user_proto_rawDescOnce sync.Once
file_user_proto_rawDescData = file_user_proto_rawDesc
)
func file_user_proto_rawDescGZIP() []byte {
file_user_proto_rawDescOnce.Do(func() {
file_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_user_proto_rawDescData)
})
return file_user_proto_rawDescData
}
var file_user_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
var file_user_proto_goTypes = []interface{}{
(*Request)(nil), // 0: com.diulo.api.request
(*Response)(nil), // 1: com.diulo.api.response
}
var file_user_proto_depIdxs = []int32{
0, // 0: com.diulo.api.user.list:input_type -> com.diulo.api.request
1, // 1: com.diulo.api.user.list:output_type -> com.diulo.api.response
1, // [1:2] is the sub-list for method output_type
0, // [0:1] is the sub-list for method input_type
0, // [0:0] is the sub-list for extension type_name
0, // [0:0] is the sub-list for extension extendee
0, // [0:0] is the sub-list for field type_name
}
func init() { file_user_proto_init() }
func file_user_proto_init() {
if File_user_proto != nil {
return
}
if !protoimpl.UnsafeEnabled {
file_user_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Request); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_user_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Response); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
}
type x struct{}
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_user_proto_rawDesc,
NumEnums: 0,
NumMessages: 2,
NumExtensions: 0,
NumServices: 1,
},
GoTypes: file_user_proto_goTypes,
DependencyIndexes: file_user_proto_depIdxs,
MessageInfos: file_user_proto_msgTypes,
}.Build()
File_user_proto = out.File
file_user_proto_rawDesc = nil
file_user_proto_goTypes = nil
file_user_proto_depIdxs = nil
}

@ -1,239 +0,0 @@
// Code generated by protoc-gen-validate. DO NOT EDIT.
// source: user.proto
package user
import (
"bytes"
"errors"
"fmt"
"net"
"net/mail"
"net/url"
"regexp"
"sort"
"strings"
"time"
"unicode/utf8"
"google.golang.org/protobuf/types/known/anypb"
)
// ensure the imports are used
var (
_ = bytes.MinRead
_ = errors.New("")
_ = fmt.Print
_ = utf8.UTFMax
_ = (*regexp.Regexp)(nil)
_ = (*strings.Reader)(nil)
_ = net.IPv4len
_ = time.Duration(0)
_ = (*url.URL)(nil)
_ = (*mail.Address)(nil)
_ = anypb.Any{}
_ = sort.Sort
)
// Validate checks the field values on Request with the rules defined in the
// proto definition for this message. If any rules are violated, the first
// error encountered is returned, or nil if there are no violations.
func (m *Request) Validate() error {
return m.validate(false)
}
// ValidateAll checks the field values on Request with the rules defined in the
// proto definition for this message. If any rules are violated, the result is
// a list of violation errors wrapped in RequestMultiError, or nil if none found.
func (m *Request) ValidateAll() error {
return m.validate(true)
}
func (m *Request) validate(all bool) error {
if m == nil {
return nil
}
var errors []error
// no validation rules for UserId
// no validation rules for UserPassword
if len(errors) > 0 {
return RequestMultiError(errors)
}
return nil
}
// RequestMultiError is an error wrapping multiple validation errors returned
// by Request.ValidateAll() if the designated constraints aren't met.
type RequestMultiError []error
// Error returns a concatenation of all the error messages it wraps.
func (m RequestMultiError) Error() string {
var msgs []string
for _, err := range m {
msgs = append(msgs, err.Error())
}
return strings.Join(msgs, "; ")
}
// AllErrors returns a list of validation violation errors.
func (m RequestMultiError) AllErrors() []error { return m }
// RequestValidationError is the validation error returned by Request.Validate
// if the designated constraints aren't met.
type RequestValidationError struct {
field string
reason string
cause error
key bool
}
// Field function returns field value.
func (e RequestValidationError) Field() string { return e.field }
// Reason function returns reason value.
func (e RequestValidationError) Reason() string { return e.reason }
// Cause function returns cause value.
func (e RequestValidationError) Cause() error { return e.cause }
// Key function returns key value.
func (e RequestValidationError) Key() bool { return e.key }
// ErrorName returns error name.
func (e RequestValidationError) ErrorName() string { return "RequestValidationError" }
// Error satisfies the builtin error interface
func (e RequestValidationError) Error() string {
cause := ""
if e.cause != nil {
cause = fmt.Sprintf(" | caused by: %v", e.cause)
}
key := ""
if e.key {
key = "key for "
}
return fmt.Sprintf(
"invalid %sRequest.%s: %s%s",
key,
e.field,
e.reason,
cause)
}
var _ error = RequestValidationError{}
var _ interface {
Field() string
Reason() string
Key() bool
Cause() error
ErrorName() string
} = RequestValidationError{}
// Validate checks the field values on Response with the rules defined in the
// proto definition for this message. If any rules are violated, the first
// error encountered is returned, or nil if there are no violations.
func (m *Response) Validate() error {
return m.validate(false)
}
// ValidateAll checks the field values on Response with the rules defined in
// the proto definition for this message. If any rules are violated, the
// result is a list of violation errors wrapped in ResponseMultiError, or nil
// if none found.
func (m *Response) ValidateAll() error {
return m.validate(true)
}
func (m *Response) validate(all bool) error {
if m == nil {
return nil
}
var errors []error
// no validation rules for Token
if len(errors) > 0 {
return ResponseMultiError(errors)
}
return nil
}
// ResponseMultiError is an error wrapping multiple validation errors returned
// by Response.ValidateAll() if the designated constraints aren't met.
type ResponseMultiError []error
// Error returns a concatenation of all the error messages it wraps.
func (m ResponseMultiError) Error() string {
var msgs []string
for _, err := range m {
msgs = append(msgs, err.Error())
}
return strings.Join(msgs, "; ")
}
// AllErrors returns a list of validation violation errors.
func (m ResponseMultiError) AllErrors() []error { return m }
// ResponseValidationError is the validation error returned by
// Response.Validate if the designated constraints aren't met.
type ResponseValidationError struct {
field string
reason string
cause error
key bool
}
// Field function returns field value.
func (e ResponseValidationError) Field() string { return e.field }
// Reason function returns reason value.
func (e ResponseValidationError) Reason() string { return e.reason }
// Cause function returns cause value.
func (e ResponseValidationError) Cause() error { return e.cause }
// Key function returns key value.
func (e ResponseValidationError) Key() bool { return e.key }
// ErrorName returns error name.
func (e ResponseValidationError) ErrorName() string { return "ResponseValidationError" }
// Error satisfies the builtin error interface
func (e ResponseValidationError) Error() string {
cause := ""
if e.cause != nil {
cause = fmt.Sprintf(" | caused by: %v", e.cause)
}
key := ""
if e.key {
key = "key for "
}
return fmt.Sprintf(
"invalid %sResponse.%s: %s%s",
key,
e.field,
e.reason,
cause)
}
var _ error = ResponseValidationError{}
var _ interface {
Field() string
Reason() string
Key() bool
Cause() error
ErrorName() string
} = ResponseValidationError{}

@ -1,15 +0,0 @@
// http.prefix:/
// @ts-ignore
import {Config,http} from "./http";
export interface request {
userId: number
userPassword: string
}
export interface response {
//密钥
token: string
}
export class userService{
}

@ -1,109 +0,0 @@
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions:
// - protoc-gen-go-grpc v1.3.0
// - protoc v3.18.1
// source: user.proto
package user
import (
context "context"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
)
// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
// Requires gRPC-Go v1.32.0 or later.
const _ = grpc.SupportPackageIsVersion7
const (
User_List_FullMethodName = "/com.diulo.api.user/list"
)
// UserClient is the client API for User service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
type UserClient interface {
List(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Response, error)
}
type userClient struct {
cc grpc.ClientConnInterface
}
func NewUserClient(cc grpc.ClientConnInterface) UserClient {
return &userClient{cc}
}
func (c *userClient) List(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Response, error) {
out := new(Response)
err := c.cc.Invoke(ctx, User_List_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// UserServer is the server API for User service.
// All implementations must embed UnimplementedUserServer
// for forward compatibility
type UserServer interface {
List(context.Context, *Request) (*Response, error)
mustEmbedUnimplementedUserServer()
}
// UnimplementedUserServer must be embedded to have forward compatible implementations.
type UnimplementedUserServer struct {
}
func (UnimplementedUserServer) List(context.Context, *Request) (*Response, error) {
return nil, status.Errorf(codes.Unimplemented, "method List not implemented")
}
func (UnimplementedUserServer) mustEmbedUnimplementedUserServer() {}
// UnsafeUserServer may be embedded to opt out of forward compatibility for this service.
// Use of this interface is not recommended, as added methods to UserServer will
// result in compilation errors.
type UnsafeUserServer interface {
mustEmbedUnimplementedUserServer()
}
func RegisterUserServer(s grpc.ServiceRegistrar, srv UserServer) {
s.RegisterService(&User_ServiceDesc, srv)
}
func _User_List_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(Request)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(UserServer).List(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: User_List_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(UserServer).List(ctx, req.(*Request))
}
return interceptor(ctx, in, info, handler)
}
// User_ServiceDesc is the grpc.ServiceDesc for User service.
// It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy)
var User_ServiceDesc = grpc.ServiceDesc{
ServiceName: "com.diulo.api.user",
HandlerType: (*UserServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "list",
Handler: _User_List_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "user.proto",
}

@ -1,14 +0,0 @@
package user
import (
"context"
"git.diulo.com/mogfee/kit/transport/http"
)
type UserHTTPServer interface {
List(context.Context, *Request) (*Response, error)
}
func RegisterUserHTTPServer(s *http.Server, srv UserServer) {
r := s.Route("/")
}

@ -2,7 +2,6 @@ package response
import ( import (
"encoding/json" "encoding/json"
"git.diulo.com/mogfee/kit/errors"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/go-playground/form" "github.com/go-playground/form"
"net/http" "net/http"
@ -53,7 +52,7 @@ func (s *result) Error(err error) {
}) })
return return
} }
gs := errors.FromError(err) gs := errorx.FromError(err)
s.Result(int(gs.Code), gs.Reason, gs.Message, gs.Metadata) s.Result(int(gs.Code), gs.Reason, gs.Message, gs.Metadata)
} }

@ -2,10 +2,9 @@ package selector
import ( import (
"context" "context"
"git.diulo.com/mogfee/kit/errors"
) )
var ErrNoAvailable = errors.ServiceUnavailable("no_available_node", "") var ErrNoAvailable = errorx.ServiceUnavailable("no_available_node", "")
type Selector interface { type Selector interface {
Rebalancer Rebalancer

@ -3,14 +3,13 @@ package binding
import ( import (
"git.diulo.com/mogfee/kit/encoding" "git.diulo.com/mogfee/kit/encoding"
"git.diulo.com/mogfee/kit/encoding/form" "git.diulo.com/mogfee/kit/encoding/form"
"git.diulo.com/mogfee/kit/errors"
"net/http" "net/http"
"net/url" "net/url"
) )
func BindQuery(vars url.Values, target any) error { func BindQuery(vars url.Values, target any) error {
if err := encoding.GetCodec(form.Name).Unmarshal([]byte(vars.Encode()), target); err != nil { if err := encoding.GetCodec(form.Name).Unmarshal([]byte(vars.Encode()), target); err != nil {
return errors.BadRequest("CODEC", err.Error()) return errorx.BadRequest("CODEC", err.Error())
} }
return nil return nil
} }
@ -19,7 +18,7 @@ func BindForm(req *http.Request, target any) error {
return err return err
} }
if err := encoding.GetCodec(form.Name).Unmarshal([]byte(req.Form.Encode()), target); err != nil { if err := encoding.GetCodec(form.Name).Unmarshal([]byte(req.Form.Encode()), target); err != nil {
return errors.BadRequest("CODEC", err.Error()) return errorx.BadRequest("CODEC", err.Error())
} }
return nil return nil
} }

@ -6,7 +6,6 @@ import (
"crypto/tls" "crypto/tls"
"fmt" "fmt"
"git.diulo.com/mogfee/kit/encoding" "git.diulo.com/mogfee/kit/encoding"
"git.diulo.com/mogfee/kit/errors"
"git.diulo.com/mogfee/kit/internal/host" "git.diulo.com/mogfee/kit/internal/host"
"git.diulo.com/mogfee/kit/internal/httputil" "git.diulo.com/mogfee/kit/internal/httputil"
"git.diulo.com/mogfee/kit/middleware" "git.diulo.com/mogfee/kit/middleware"
@ -260,7 +259,7 @@ func (client *Client) do(req *http.Request) (*http.Response, error) {
node selector.Node node selector.Node
) )
if node, done, err = client.selector.Select(req.Context(), selector.WithNodeFilter(client.opts.nodeFilters...)); err != nil { if node, done, err = client.selector.Select(req.Context(), selector.WithNodeFilter(client.opts.nodeFilters...)); err != nil {
return nil, errors.ServiceUnavailable("NODE_NOT_FOUND", err.Error()) return nil, errorx.ServiceUnavailable("NODE_NOT_FOUND", err.Error())
} }
if client.insecure { if client.insecure {
req.URL.Scheme = "http" req.URL.Scheme = "http"
@ -307,13 +306,13 @@ func DefaultErrorDecoder(ctx context.Context, res *http.Response) error {
data, err := io.ReadAll(res.Body) data, err := io.ReadAll(res.Body)
defer res.Body.Close() defer res.Body.Close()
if err == nil { if err == nil {
e := new(errors.Error) e := new(errorx.Error)
if err = CodecForResponse(res).Unmarshal(data, e); err == nil { if err = CodecForResponse(res).Unmarshal(data, e); err == nil {
e.Code = int32(res.StatusCode) e.Code = int32(res.StatusCode)
return e return e
} }
} }
return errors.Newf(res.StatusCode, errors.UnknownReason, "").WithCause(err) return errorx.Newf(res.StatusCode, errorx.UnknownReason, "").WithCause(err)
} }
func CodecForResponse(r *http.Response) encoding.Codec { func CodecForResponse(r *http.Response) encoding.Codec {
codec := encoding.GetCodec(httputil.ContentSubtype(r.Request.Header.Get("Content-Type"))) codec := encoding.GetCodec(httputil.ContentSubtype(r.Request.Header.Get("Content-Type")))

@ -4,7 +4,6 @@ import (
"bytes" "bytes"
"fmt" "fmt"
"git.diulo.com/mogfee/kit/encoding" "git.diulo.com/mogfee/kit/encoding"
"git.diulo.com/mogfee/kit/errors"
"git.diulo.com/mogfee/kit/internal/httputil" "git.diulo.com/mogfee/kit/internal/httputil"
"git.diulo.com/mogfee/kit/transport/http/binding" "git.diulo.com/mogfee/kit/transport/http/binding"
"github.com/gorilla/mux" "github.com/gorilla/mux"
@ -39,18 +38,18 @@ func DefaultRequestQuery(r *http.Request, v any) error {
func DefaultRequestDecoder(r *http.Request, v any) error { func DefaultRequestDecoder(r *http.Request, v any) error {
codec, ok := CodeForRequest(r, "Content-Type") codec, ok := CodeForRequest(r, "Content-Type")
if !ok { if !ok {
return errors.BadRequest("CODEC", fmt.Sprintf("unregister Content-Type: %s", codec)) return errorx.BadRequest("CODEC", fmt.Sprintf("unregister Content-Type: %s", codec))
} }
data, err := io.ReadAll(r.Body) data, err := io.ReadAll(r.Body)
if err != nil { if err != nil {
return errors.BadRequest("CODEC", err.Error()) return errorx.BadRequest("CODEC", err.Error())
} }
r.Body = io.NopCloser(bytes.NewBuffer(data)) r.Body = io.NopCloser(bytes.NewBuffer(data))
if len(data) == 0 { if len(data) == 0 {
return nil return nil
} }
if err = codec.Unmarshal(data, v); err != nil { if err = codec.Unmarshal(data, v); err != nil {
return errors.BadRequest("CODEC", err.Error()) return errorx.BadRequest("CODEC", err.Error())
} }
return nil return nil
} }
@ -73,7 +72,7 @@ func DefaultResponseEncoder(w http.ResponseWriter, r *http.Request, v any) error
return err return err
} }
func DefaultErrorEncoder(w http.ResponseWriter, r *http.Request, err error) { func DefaultErrorEncoder(w http.ResponseWriter, r *http.Request, err error) {
se := errors.FromError(err) se := errorx.FromError(err)
codec, _ := CodeForRequest(r, "Accept") codec, _ := CodeForRequest(r, "Accept")
body, err := codec.Marshal(se) body, err := codec.Marshal(se)
if err != nil { if err != nil {

@ -7,7 +7,6 @@ import (
"git.diulo.com/mogfee/kit/internal/endpoint" "git.diulo.com/mogfee/kit/internal/endpoint"
"git.diulo.com/mogfee/kit/internal/host" "git.diulo.com/mogfee/kit/internal/host"
"git.diulo.com/mogfee/kit/internal/matcher" "git.diulo.com/mogfee/kit/internal/matcher"
"git.diulo.com/mogfee/kit/log"
"git.diulo.com/mogfee/kit/middleware" "git.diulo.com/mogfee/kit/middleware"
"git.diulo.com/mogfee/kit/transport" "git.diulo.com/mogfee/kit/transport"
"net" "net"
@ -50,7 +49,7 @@ func Timeout(timeout time.Duration) ServerOption {
// Logger with server logger. // Logger with server logger.
// Deprecated: use global logger instead. // Deprecated: use global logger instead.
func Logger(logger log.Logger) ServerOption { func Logger(logger logx.Logger) ServerOption {
return func(s *Server) {} return func(s *Server) {}
} }
@ -259,7 +258,7 @@ func (s *Server) Start(ctx context.Context) error {
s.BaseContext = func(listener net.Listener) context.Context { s.BaseContext = func(listener net.Listener) context.Context {
return ctx return ctx
} }
log.Infof("[HTTP] server listening on: %s", s.endpoint) logx.Infof("[HTTP] server listening on: %s", s.endpoint)
var err error var err error
if s.tlsConf != nil { if s.tlsConf != nil {
err = s.ServeTLS(s.lis, "", "") err = s.ServeTLS(s.lis, "", "")
@ -273,7 +272,7 @@ func (s *Server) Start(ctx context.Context) error {
} }
func (s *Server) Stop(ctx context.Context) error { func (s *Server) Stop(ctx context.Context) error {
log.Info("[HTTP] server stopping") logx.Info("[HTTP] server stopping")
return s.Shutdown(ctx) return s.Shutdown(ctx)
} }
func (s *Server) filter() mux.MiddlewareFunc { func (s *Server) filter() mux.MiddlewareFunc {

@ -1,15 +0,0 @@
//none
// @ts-ignore
import {Config,http} from "./http";
export interface request {
userId: number
userPassword: string
}
export interface response {
//密钥
token: string
}
export class userService{
}
Loading…
Cancel
Save