do

package module
v1.24.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 6, 2024 License: MIT Imports: 47 Imported by: 4

README

do

GoDoc Go Report Card

Do something interesting.

Base Go1.18 with generic.

Usage of letgo

  • TCP代理
  • 从SQL建表语句生成结构体
  • 从接口定义生成Mock结构体

Install: go install github.com/donnol/do/cmd/letgo@latest

Usage:

NAME:
   letgo.exe - A new cli application

USAGE:
   letgo.exe [global options] command [command options] [arguments...]

COMMANDS:
   proxy       letgo proxy --localAddr=':54388' --remoteAddr='127.0.0.1:54399'
   sql2struct  letgo sql2struct 'create table user(id int not null)'
   mock        letgo mock -p=github.com/xxx/yyy -r
   help, h     Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --help, -h  show help

Must

Panic if error is not nil, otherwise return some result except the error.

package main

import (
	"fmt"

	"github.com/donnol/do"
)

func main() {
	do.Must(retErr()) // without result

	// specify result type with type parameter
	_ = do.Must1(retErrAndOneResult()) // with one result

	_, _ = do.Must2(retErrAndTwoResult()) // with two result
}

func retErr() error {
	return fmt.Errorf("a new error")
}

func retErrAndOneResult() (int, error) {
	return 1, fmt.Errorf("a new error")
}

func retErrAndTwoResult() (int, int, error) {
	return 0, 1, fmt.Errorf("a new error")
}

Slice to map by key

r := KeyValueBy([]string{"a", "aa", "aaa"}, func(str string) (string, int) {
	return str, len(str)
})
want := map[string]int{"a": 1, "aa": 2, "aaa": 3}
// r is what we want.

Join

r := NestedJoin([]Book{
	{Id: 1, Title: "hello", Author: 1},
	{Id: 2, Title: "world", Author: 1},
	{Id: 3, Title: "good", Author: 2},
	{Id: 4, Title: "job", Author: 2},
}, []User{
	{Id: 1, Name: "jd"},
	{Id: 2, Name: "jc"},
}, UserBookMatcher, func(j Book, k User) BookWithUser {
	return BookWithUser{
		Book:     j,
		UserName: k.Name,
	}
})
want := []BookWithUser{
	{Book{1, "hello", 1}, "jd"},
	{Book{2, "world", 1}, "jd"},
	{Book{3, "good", 2}, "jc"},
	{Book{4, "job", 2}, "jc"},
}
// r is what we want.
r := HashJoin([]Book{
	{Id: 1, Title: "hello", Author: 1},
	{Id: 2, Title: "world", Author: 1},
	{Id: 3, Title: "good", Author: 2},
	{Id: 4, Title: "job", Author: 2},
}, []User{
	{Id: 1, Name: "jd"},
	{Id: 2, Name: "jc"},
}, func(item Book) uint64 {
	return item.Author
}, func(item User) uint64 {
	return item.Id
}, func(j Book, k User) BookWithUser {
	return BookWithUser{
		Book:     j,
		UserName: k.Name,
	}
})
want := []BookWithUser{
	{Book{1, "hello", 1}, "jd"},
	{Book{2, "world", 1}, "jd"},
	{Book{3, "good", 2}, "jc"},
	{Book{4, "job", 2}, "jc"},
}
// r is what we want.

Send HTTP request

Send a http request with a simple function.

Worker

A worker pool process job with a limited number Goroutine.

DB connect and find

// 0. open a db
var tdb *sql.DB

// 1. define a finder
type finderOfUser struct {
	id uint64
}

func (f *finderOfUser) Query() (query string, args []any) {
	query = `select * from user where id = ?`
	args = append(args, f.id)
	return
}

func (f *finderOfUser) NewScanObjAndFields(colTypes []*sql.ColumnType) (r *UserForDB, fields []any) {
	r = &UserForDB{}
	fields = append(fields,
		&r.Id,
		&r.Name,
	)
	return
}

// 2. find
finder := &finderOfUser{
	id: 1,
}
r, err := do.FindAll(tdb, finder, (UserForDB{}))
if err != nil {
	panic(err)
}

// 3. find per batch
finder := &finderOfUser{
	id: 1,
}
// batchNum is 10, if there are 20 records, it will be processed in two parts
err := do.Batch(tdb, finder, 10, func(r []UserForDB) error {
	// Process this batch of data

	return nil
}

Documentation

Index

Constants

View Source
const (
	DateTimeFormat = "2006-01-02 15:04:05"
	DateFormat     = "2006-01-02"
)

Variables

View Source
var (
	// ErrTooManyRequests is returned when the CB state is half open and the requests count is over the cb maxRequests
	ErrTooManyRequests = errors.New("too many requests")
	// ErrOpenState is returned when the CB state is open
	ErrOpenState = errors.New("circuit breaker is open")
)
View Source
var (
	ErrBadIssuer = errors.New("Token Bad Issuer")
	ErrExpired   = errors.New("Token Expired")
	ErrNotValid  = errors.New("Token Not Valid")
)
View Source
var (
	ErrWorkerIsStop = errors.New("Worker is stop")
	ErrNilJobDo     = errors.New("Job do field is nil")
)
View Source
var (
	ErrNilDoer = errors.New("f is nil")
)
View Source
var (
	Location = time.FixedZone("CST", 8*3600) // 东八,Asia/Shanghai
)

Functions

func AgeByBirth added in v1.1.0

func AgeByBirth(birthday time.Time, now ...time.Time) (age int, unit string)

AgeByBirth get age and unit by birthday. It will use time.Now() if not input now. If exist year, ignore month and day; If exist month, ignore day.

func As added in v0.8.0

func As[T any](v any) T

As assert the value v to type T

func AsOk added in v0.27.0

func AsOk[T any](v any) (T, bool)

func Assert added in v0.33.0

func Assert[T comparable](handler AssertHandler, l, r T, msgAndArgs ...any)

func AssertSlice added in v0.61.0

func AssertSlice[T comparable](handler AssertHandler, lslice, rslice []T, msgAndArgs ...any)

func AssertSlicePtr added in v1.11.0

func AssertSlicePtr[T comparable](handler AssertHandler, lslice, rslice []*T, msgAndArgs ...any)

func Batch added in v0.2.0

func Batch[S Storer, F Finder[R], R any](db S, finder F, batchNum int, handler func([]R) error) (err error)

Batch process data find from Storer in batches

func BatchConcurrent added in v0.2.0

func BatchConcurrent[S Storer, F Finder[R], R any](db S, finder F, batchNum int, handler func([]R) error, concNum int) (err error)

BatchConcurrent batch process data concurrently

func BatchRun added in v0.36.0

func BatchRun[T any](s []T, batchNum int, handler func([]T) error) (err error)

BatchRun handle data per batch

func BatchRunR added in v1.17.0

func BatchRunR[T, R any](s []T, batchNum int, handler func([]T) ([]R, error)) (all []R, err error)

BatchRunR handle data per batch

func BinPow added in v1.22.0

func BinPow(a, b int) int

BinPow return a**b with binary pow. if `a` or `b` is very big, use `BinPowBig` instead

func BinPowBig added in v1.22.0

func BinPowBig(a, b int) string

BinPow return a**b with binary pow

func BytesToString added in v0.5.0

func BytesToString(b []byte) string

BytesToString converts byte slice to string without a memory allocation.

func CallInDefRec added in v0.85.0

func CallInDefRec[P, R any](c C, p P, f func(C, P) R) R

CallInDefRec run f with defer recover to catch panic

func Ceil added in v0.50.0

func Ceil(x float64, p int) float64

func CodeIs200 added in v0.2.0

func CodeIs200(code int) error

func ConvByName added in v0.54.0

func ConvByName[F, T any](from F, to T)

ConvByName fill 'to' struct with 'from' by name like to.Name = from.Name to must be a struct pointer

func ConvSliceByName added in v0.54.0

func ConvSliceByName[F, T any](from []F, to []T)

ConvSliceByName fill 'to' struct slice with 'from' by name

func Copy added in v0.88.0

func Copy[T any](v *T) *T

Copy return a copy of v's value without deep copy. If you need deep copy, use DeepCody instead.

func Date added in v1.13.0

func Date(year int, month time.Month, day int, loc *time.Location) time.Time

func DateLocal added in v1.13.0

func DateLocal(year int, month time.Month, day int) time.Time

func DayZero added in v0.18.0

func DayZero(t time.Time) time.Time

func DeepCopy added in v0.90.0

func DeepCopy[T any](v T) T

Copy creates a deep copy of whatever is passed to it and returns the copy in an interface{}. The returned value will need to be asserted to the correct type. It will not copy unexported fields.

func Equal added in v0.33.0

func Equal[T comparable](l, r T) bool

func EscapeStruct added in v1.2.0

func EscapeStruct(v any, escaper Escaper) (err error)

EscapeStruct escape struct field value with escaper, v must be a struct pointer

func EventLoop added in v0.25.0

func EventLoop[I, O, R any](ctx C, n int) (chan<- EventEntity[I, O, R], chan<- struct{})

func ExecWithBatch added in v0.35.0

func ExecWithBatch[S Storer, Q Queryer](db S, batch []Q) (ra, lid int64, err error)

ExecWithBatch exec with batch

func Factorial added in v1.4.0

func Factorial(n int) int

Factorial n <= 20, it will return 0 if n > 20, use FactorialBig instead.

func FactorialBig added in v1.4.0

func FactorialBig(n int) string

FactorialBig n > 20

func FieldWithAlias added in v0.53.0

func FieldWithAlias(field, alias, defaultAlias string) string

FieldWithAlias use alias if not empty, or use defaultAlias

func FieldsByColumnType added in v0.10.0

func FieldsByColumnType(t any, colTypes []*sql.ColumnType, fieldMapper func(string) string) (fields []any)

FieldsByColumnType t is a struct pointer, and use it's field match column name to receive scan value. It will use db tag to get column name first, or lower case field name. You can specify fieldMapper to control column name with field name

func FindAll added in v0.2.0

func FindAll[S Storer, F Finder[R], R any](db S, finder F, initial R) (r []R, err error)

func FindFirst added in v0.2.0

func FindFirst[S Storer, F Finder[R], R any](db S, finder F, res *R) (err error)

func FindFirstByFunc added in v0.16.0

func FindFirstByFunc[S Storer, F FindFunc[R], R any](db S, finder F, res *R) (err error)

func FindList added in v0.2.0

func FindList[S Storer, F Finder[R], R any](db S, finder F, res *[]R) (err error)

func FindListByFunc added in v0.16.0

func FindListByFunc[S Storer, F FindFunc[R], R any](db S, finder F, res *[]R) (err error)

func FindOne added in v0.2.0

func FindOne[S Storer, F Finder[R], R any](db S, finder F, initial R) (r R, err error)

func FindWithBatch added in v0.35.0

func FindWithBatch[S Storer, B Batcher[R], R any](db S, batcher B, res *[]R) (err error)

FindWithBatch use batchFunc to split args to little batch, for example: args is 1, [1, 2, 3], split to 3 batch is: 1, [1]; 1, [2]; 3, [3], the slice become little while the others is not change

func First added in v0.98.0

func First[T any](s []T) (t T, ok bool)

func FirstOr added in v1.14.0

func FirstOr[T any](s []T) (t T)

func Floor added in v0.50.0

func Floor(x float64, p int) float64

func ForgotKey added in v0.6.0

func ForgotKey(key string)

func FuncName added in v0.2.0

func FuncName(skip int, withFileInfo bool) string

func FuzzWrap added in v1.18.0

func FuzzWrap(v string) string

func Go added in v0.84.0

func Go[P any](c C, p P, f func(C, P))

Go run f in a new goroutine with defer recover

func GoR added in v0.84.0

func GoR[P, R any](c C, p P, f func(C, P) R) <-chan R

GoR run f in a new goroutine with defer recover, and return a chan of R

func HTMLEscaper added in v1.2.0

func HTMLEscaper(field any) (r any, err error)

func HTTPProxy added in v0.27.0

func HTTPProxy(localAddr, remoteAddr string, opt *HTTPProxyOption) (err error)

HTTPProxy listen localAddr and transfer any request to remoteAddr. We can use handlers to specify one custom func to transfer data.

func HTTPSProxy added in v1.14.0

func HTTPSProxy(localAddr string, opt *HTTPSProxyOption) (err error)

func HandleResult added in v0.89.0

func HandleResult(r sql.Result) (id int64, n int64, err error)

HandleResult check affected rows first, if it is not zero then get last insert id

func HashJoin added in v0.2.0

func HashJoin[K comparable, LE, RE, R any](
	left []LE,
	right []RE,
	lk func(item LE) K,
	rk func(item RE) K,
	mapper func(LE, RE) R,
) []R

HashJoin like hash join

func Ignore1 added in v0.52.0

func Ignore1[T1, T2 any](a1 T1, i T2) T1

Ignore1 ignore the last variable,and continue with 1 result

func Ignore2 added in v0.52.0

func Ignore2[T1, T2, T3 any](a1 T1, a2 T2, i T3) (T1, T2)

Ignore2 ignore the last variable,and continue with 2 result

func Ignore3 added in v0.52.0

func Ignore3[T1, T2, T3, T4 any](a1 T1, a2 T2, a3 T3, i T4) (T1, T2, T3)

Ignore3 ignore the last variable,and continue with 3 result

func Ignore4 added in v0.52.0

func Ignore4[T1, T2, T3, T4, T5 any](a1 T1, a2 T2, a3 T3, a4 T4, i T5) (T1, T2, T3, T4)

Ignore4 ignore the last variable,and continue with 4 result

func Ignore5 added in v0.52.0

func Ignore5[T1, T2, T3, T4, T5, T6 any](a1 T1, a2 T2, a3 T3, a4 T4, a5 T5, i T6) (T1, T2, T3, T4, T5)

Ignore5 ignore the last variable,and continue with 5 result

func In added in v0.82.0

func In[S comparable](s []S, e S) bool

func Index added in v0.98.0

func Index[T any](s []T, i int) (t T, ok bool)

func IndexOr added in v1.14.0

func IndexOr[T any](s []T, i int) (t T)

func IsComparable added in v0.8.0

func IsComparable[T comparable]()

IsComparable check if a type is comparable in compile time

func IsExpired added in v0.11.0

func IsExpired(deadline, now time.Time) bool

IsExpired show if deadline is expired compared to now always return false if deadline is zero

func IsPowerOf2 added in v1.11.0

func IsPowerOf2(n uint64) bool

func IsSignDiff added in v1.11.0

func IsSignDiff(x, y int) bool

func IsValidIP added in v0.28.0

func IsValidIP(ip string) bool

IsValidIP check the ip if is a valid ipv4 or ipv6 addr.

func IsZero added in v0.12.0

func IsZero[T comparable](v T) bool

func JSONExtractor added in v0.2.0

func JSONExtractor[R any](data []byte) (R, error)

func JoinUint added in v0.40.0

func JoinUint(parts []uint64) (n uint64)

func KeyBy added in v0.2.0

func KeyBy[K comparable, E any](collection []E, iteratee func(item E) K) map[K]E

KeyBy slice to map, key specified by iteratee, value is slice element

func KeyValueBy added in v0.2.0

func KeyValueBy[K comparable, E, V any](collection []E, iteratee func(item E) (K, V)) map[K]V

KeyValueBy slice to map, key value specified by iteratee

func KeyValueGroupBy added in v1.16.0

func KeyValueGroupBy[K comparable, E, V any](collection []E, iteratee func(item E) (K, V)) map[K][]V

KeyValueGroupBy []int{{id: 1, from: gd}, {id: 2, from: gd}} -> map[string][]int{gd: []int{1, 2}}

func Keys added in v0.8.0

func Keys[K comparable, E any](collection map[K]E) []K

func Last added in v0.98.0

func Last[T any](s []T) (t T, ok bool)

func LastOr added in v1.14.0

func LastOr[T any](s []T) (t T)

func Log added in v0.32.0

func Log(err error)

Log log the err if err is not nill and continue

func Log1 added in v0.32.0

func Log1[T any](a1 T, err error) T

Log1 log the err if err is not nill,and continue with 1 result

func Log2 added in v0.32.0

func Log2[T1, T2 any](a1 T1, a2 T2, err error) (T1, T2)

Log2 log the err if err is not nill,and continue with 2 result

func Log3 added in v0.32.0

func Log3[T1, T2, T3 any](a1 T1, a2 T2, a3 T3, err error) (T1, T2, T3)

Log3 log the err if err is not nill,and continue with 3 result

func Log4 added in v0.32.0

func Log4[T1, T2, T3, T4 any](a1 T1, a2 T2, a3 T3, a4 T4, err error) (T1, T2, T3, T4)

Log4 log the err if err is not nill,and continue with 4 result

func Log5 added in v0.32.0

func Log5[T1, T2, T3, T4, T5 any](a1 T1, a2 T2, a3 T3, a4 T4, a5 T5, err error) (T1, T2, T3, T4, T5)

Log5 log the err if err is not nill,and continue with 5 result

func MakeSlice added in v0.54.0

func MakeSlice[T any](l int) (to []*T)

func MapFrom added in v1.11.0

func MapFrom[T any, R interface{ From(T) }](s []T, initial func() R) []R

func MapFrom2 added in v1.12.0

func MapFrom2[T any, R interface{ From(T) R }](s []T) []R

func MapSlicePtr added in v1.15.0

func MapSlicePtr[T *R, R any](s []T) []R

func MapTo added in v1.11.0

func MapTo[T interface{ To() R }, R any](s []T) []R

func MapTo2 added in v1.12.0

func MapTo2[T interface{ To(T) R }, R any](s []T) []R

func MatchError

func MatchError(v any) bool

func MergeKeyValue added in v0.15.0

func MergeKeyValue[K comparable, V any](m1, m2 map[K]V) map[K]V

MergeKeyValue merge m2 into m1, will override m1 key value if both exists

func MkdirAllIfNotExist added in v0.8.0

func MkdirAllIfNotExist(dir string) error

func MonthFirst added in v0.18.0

func MonthFirst(t time.Time) time.Time

func MultipartBody added in v0.23.0

func MultipartBody(body io.Writer, fieldname, filename string, data []byte) (fileContentType string, err error)

MultipartBody new a multipart writer with body, mark with fieldname and name, write data to it. Return form data content type.

func Must

func Must(err error)

Must panic if err is not nill

func Must1

func Must1[T any](a1 T, err error) T

Must1 panic if err is not nill,or return 1 result

func Must2

func Must2[T1, T2 any](a1 T1, a2 T2, err error) (T1, T2)

Must2 panic if err is not nill,or return 2 result

func Must3

func Must3[T1, T2, T3 any](a1 T1, a2 T2, a3 T3, err error) (T1, T2, T3)

Must3 panic if err is not nill,or return 3 result

func Must4

func Must4[T1, T2, T3, T4 any](a1 T1, a2 T2, a3 T3, a4 T4, err error) (T1, T2, T3, T4)

Must4 panic if err is not nill,or return 4 result

func Must5

func Must5[T1, T2, T3, T4, T5 any](a1 T1, a2 T2, a3 T3, a4 T4, a5 T5, err error) (T1, T2, T3, T4, T5)

Must5 panic if err is not nill,or return 5 result

func NestedJoin added in v0.2.0

func NestedJoin[J, K, R any](
	left []J,
	right []K,
	match func(J, K) bool,
	mapper func(J, K) R,
) []R

NestedJoin like nested loop join

func NewError

func NewError[T any](inner T) error

func NewHTTPClient added in v0.91.0

func NewHTTPClient(opts ...HTTPClientSetter) *http.Client

func ObjectAndFieldsHelper added in v0.41.0

func ObjectAndFieldsHelper[T any](fieldMappers ...func(string) string) func(colTypes []*sql.ColumnType) (r *T, fields []any)

ObjectAndFieldsHelper if *T is interface{ ValuePtrs() []any } then use its results as fields, otherwise use reflect to get fields by ColumnType

func Or added in v1.9.0

func Or[T comparable](vals ...T) T

Or returns the first of its arguments that is not equal to the zero value. If no argument is non-zero, it returns the zero value.

func ParseTime added in v0.18.0

func ParseTime(t string, layouts ...string) (r time.Time, err error)

ParseTime parse time string t with layout s one by one; if layouts is empty, it will use "2006-01-02 15:04:05" as default

func Pointer added in v0.98.0

func Pointer[T any]() *T

Pointer return a pointer of type T

func Pow10 added in v0.40.0

func Pow10(n int) (r uint64)

Pow10 10^n, return 0 if n < 0

func PrintFields added in v0.2.0

func PrintFields(fields []any)

func ProxyTraceBegin added in v0.13.0

func ProxyTraceBegin(pctx ProxyContext, extras ...any) (stop func(args ...any))

ProxyTraceBegin LIFO

func RawExtractor added in v0.25.0

func RawExtractor(data []byte) ([]byte, error)

func Rectangle added in v1.15.0

func Rectangle[T any](m, n int, initial ...T) [][]T

func RegisterProxyMethod added in v0.14.0

func RegisterProxyMethod(pctx ProxyContext, cf ProxyCtxFunc, typeParams ...string)

RegisterProxyMethod 注册代理方法,根据包名+接口名+方法名唯一对应一个方法;在有了泛型后还要加上类型参数,唯一键变为包名+接口名+方法名+TP1,TP2,...

func RegisterProxyTracer added in v0.13.0

func RegisterProxyTracer(tracers ...Tracer)

func RegisterRouter added in v0.34.0

func RegisterRouter[H RouteRegister, RH RouteHandler[P, R], P, R any](
	g H,
	rh RH,
	method, path string,
	f func(context.Context, P) (R, error),
)

RegisterRouter register router to RouteRegister with http.HandlerFunc

func ReplaceIP added in v0.94.0

func ReplaceIP(link, ip, nip string) (r string, err error)

ReplaceIP replace link 's ip with nip

func RetryWithDeadline added in v0.5.0

func RetryWithDeadline(ctx context.Context, d time.Time, f Doer) error

RetryWithDeadline retry f before d exceeds if f failed

func RetryWithTimes added in v0.5.0

func RetryWithTimes(ctx context.Context, tryTimes int, f Doer) error

RetryWithTimes retry f tryTimes times if f failed

func Return1 added in v1.22.0

func Return1[T any](a1 T, err error) T

func Round added in v0.50.0

func Round(x float64, p int) float64

func RunWithTimeout added in v0.87.0

func RunWithTimeout[P, R any](ctx C, d time.Duration, p P, f func(ctx C, p P) R) (r R, ok bool)

RunWithTimeout run func with timeout, return even if the func haven't completed. `ok` will report if the func has completed

func SendHTTPRequest added in v0.2.0

func SendHTTPRequest[R any](
	client *http.Client,
	method string,
	link string,
	body io.Reader,
	header http.Header,
	codeChecker CodeChecker,
	extractResult ResultExtractor[R],
) (R, error)

SendHTTPRequest send http request and get result of type R. If you want to got resp header, the R should implement RespHeaderExtractor interface.

func SingleFlight added in v0.6.0

func SingleFlight[R any](key string, fn SingleFlightCall[R]) (r R, err error)

SingleFlight make sure only one request is doing with one key

func SplitUint added in v0.40.0

func SplitUint(n uint64) []uint64

SplitUint 0 -> [0], [1234] -> [1, 2, 3, 4]

func Square added in v1.15.0

func Square[T any](n int, initial ...T) [][]T

func StreamRun added in v0.36.0

func StreamRun[T any](s chan T, batchNum int, handler func([]T) error) (err error)

StreamRun handle data by stream, if batchNum is >0, run with batch

func StreamRunR added in v1.17.0

func StreamRunR[T, R any](s chan T, batchNum int, handler func([]T) ([]R, error)) (all []R, err error)

StreamRunR handle data by stream, if batchNum is >0, run with batch

func StringToBytes added in v0.5.0

func StringToBytes(s string) []byte

StringToBytes converts string to byte slice without a memory allocation.

func SwapByBit added in v1.11.0

func SwapByBit(a, b int) (int, int)

func TCPProxy added in v0.19.0

func TCPProxy(localAddr, remoteAddr string, handlers ...func(lconn, rconn net.Conn)) (err error)

TCPProxy listen localAddr and transfer any request to remoteAddr.We can use handlers to specify one custom func to transfer data.

func TCPProxyDefaultHandler added in v0.20.0

func TCPProxyDefaultHandler(lconn, rconn net.Conn)

func TCPRecv added in v0.19.0

func TCPRecv(localAddr string, handler func(conn net.Conn)) (err error)

TCPRecv recv from local addr with handler, it will block on (*net.TCPListener).Accept

func TCPSend added in v0.19.0

func TCPSend(remoteAddr string, handler func(conn net.Conn) error) (err error)

TCPSend send to remote addr with handler

func ThisMonthFirst added in v0.12.0

func ThisMonthFirst() time.Time

func ThisYearFirst added in v0.12.0

func ThisYearFirst() time.Time

func TodayZero added in v0.12.0

func TodayZero() time.Time

func Unique added in v0.82.0

func Unique[S comparable](s []S) []S

func ValueAs added in v0.8.0

func ValueAs[K comparable, T any](m *Map[K, any], key K) T

ValueAs get value by key from *Map[K, any], and assert value type to T

func ValueOf added in v1.8.0

func ValueOf[F any](v any, field string) (f F, ok bool)

ValueOf return v.field's value, if v is a struct or map

func Values added in v0.8.0

func Values[K comparable, E any](collection map[K]E) []E

func WithWhere added in v0.53.0

func WithWhere[T comparable](
	t T,
	cond func(field string, value interface{}) string,
	field string,
	value ...T,
) string

WithWhere return condition if t is not a zero value of T

func WrapConnFindAll added in v0.2.0

func WrapConnFindAll[F Finder[R], R any](
	ctx context.Context,
	db *sql.DB,
	finder F,
	initial R,
) (r []R, err error)

WrapConnFindAll query by stmt and args, return values with dest support many rows

func WrapDB added in v0.2.0

func WrapDB(
	ctx context.Context,
	driverName string,
	dataSourceName string,
	f func(
		ctx context.Context,
		conn *sql.DB,
	) error,
) error

func WrapSQLConn added in v0.2.0

func WrapSQLConn(
	ctx context.Context,
	db *sql.DB,
	f func(
		ctx context.Context,
		conn *sql.Conn,
	) error,
) error

func WrapSQLConnV added in v1.22.0

func WrapSQLConnV[R any](
	ctx context.Context,
	db *sql.DB,
	f func(
		ctx context.Context,
		conn *sql.Conn,
	) (R, error),
) (r R, err error)

func WrapSQLQueryRows added in v0.2.0

func WrapSQLQueryRows(
	ctx context.Context,
	db *sql.DB,
	stmt string,
	args []interface{},
	dest ...interface{},
) error

WrapSQLQueryRows query by stmt and args, return values with dest only support one row

func WrapTx added in v0.2.0

func WrapTx(
	ctx context.Context,
	db *sql.DB,
	f func(
		ctx context.Context,
		tx *sql.Tx,
	) error,
) (err error)

func WrapTxFindAll added in v0.2.0

func WrapTxFindAll[F Finder[R], R any](
	ctx context.Context,
	db *sql.DB,
	finder F,
	initial R,
) (r []R, err error)

func WrapTxV added in v0.51.0

func WrapTxV[R any](
	ctx context.Context,
	db *sql.DB,
	f func(
		ctx context.Context,
		tx *sql.Tx,
	) (R, error),
) (r R, err error)

func XMLEscaper added in v1.2.0

func XMLEscaper(field any) (r any, err error)

func XMLExtractor added in v0.2.0

func XMLExtractor[R any](data []byte) (R, error)

func YearFirst added in v0.18.0

func YearFirst(t time.Time) time.Time

func Zero added in v0.27.0

func Zero[T any]() T

Types

type APIType added in v1.23.0

type APIType struct{}

接口信息

type APITypeCtxHelper added in v1.23.0

type APITypeCtxHelper = ContextHelper[APIType, string]

type AssertHandler added in v0.33.0

type AssertHandler interface {
	Errorf(format string, args ...any)
}

type Batcher added in v0.35.0

type Batcher[T any] interface {
	Batch() []Finder[T]
}

type C added in v0.24.0

type C = context.Context

type CheckDataPerm added in v1.23.0

type CheckDataPerm struct{}

数据权限

type CheckDataPermCtxHelper added in v1.23.0

type CheckDataPermCtxHelper = ContextHelper[CheckDataPerm, bool]

type CircuitBreaker added in v0.30.0

type CircuitBreaker[P, R any] struct {
	// contains filtered or unexported fields
}

CircuitBreaker is a state machine to prevent sending requests that are likely to fail.

func NewCircuitBreaker added in v0.30.0

func NewCircuitBreaker[P, R any](st Settings) *CircuitBreaker[P, R]

NewCircuitBreaker returns a new CircuitBreaker configured with the given Settings.

func (*CircuitBreaker[P, R]) Counts added in v0.30.0

func (cb *CircuitBreaker[P, R]) Counts() Counts

Counts returns internal counters

func (*CircuitBreaker[P, R]) Execute added in v0.30.0

func (cb *CircuitBreaker[P, R]) Execute(param P, req func(p P) (R, error)) (r R, err error)

Execute runs the given request if the CircuitBreaker accepts it. Execute returns an error instantly if the CircuitBreaker rejects the request. Otherwise, Execute returns the result of the request. If a panic occurs in the request, the CircuitBreaker handles it as an error and causes the same panic again.

func (*CircuitBreaker[P, R]) Name added in v0.30.0

func (cb *CircuitBreaker[P, R]) Name() string

Name returns the name of the CircuitBreaker.

func (*CircuitBreaker[P, R]) State added in v0.30.0

func (cb *CircuitBreaker[P, R]) State() State

State returns the current state of the CircuitBreaker.

type Claims added in v0.57.0

type Claims[T any] struct {
	User  T
	Nonce string
	jwt.RegisteredClaims
}

type CodeChecker added in v0.2.0

type CodeChecker func(code int) error

type ContextHelper added in v0.37.0

type ContextHelper[K ~struct{}, V any] struct {
	// contains filtered or unexported fields
}

func (ContextHelper[K, V]) MustValue added in v0.37.0

func (h ContextHelper[K, V]) MustValue(ctx context.Context) (v V)

func (ContextHelper[K, V]) Value added in v0.37.0

func (h ContextHelper[K, V]) Value(ctx context.Context) (v V, ok bool)

func (ContextHelper[K, V]) WithValue added in v0.37.0

func (h ContextHelper[K, V]) WithValue(ctx context.Context, v V) context.Context

type Counts added in v0.30.0

type Counts struct {
	Requests             uint32
	TotalSuccesses       uint32
	TotalFailures        uint32
	ConsecutiveSuccesses uint32
	ConsecutiveFailures  uint32
}

Counts holds the numbers of requests and their successes/failures. CircuitBreaker clears the internal Counts either on the change of the state or at the closed-state intervals. Counts ignores the results of the requests sent before clearing.

type Crypto added in v0.56.0

type Crypto struct {
	// contains filtered or unexported fields
}

func NewCrypto added in v0.56.0

func NewCrypto(key string) (*Crypto, error)

NewCrypto NewCrypto key: 16, 24, or 32 bytes to select AES-128, AES-192, or AES-256.

func (Crypto) Decrypt added in v0.56.0

func (e Crypto) Decrypt(r string) (money string, err error)

func (Crypto) Encrypt added in v0.56.0

func (e Crypto) Encrypt(money string) (r string, err error)

type DataPermJoinType added in v1.23.0

type DataPermJoinType struct{}

数据权限join语句

type DataPermJoinTypeCtxHelper added in v1.23.0

type DataPermJoinTypeCtxHelper = ContextHelper[DataPermJoinType, [][]string]

type DataPermType added in v1.23.0

type DataPermType struct{}

数据权限条件语句

type DataPermTypeCtxHelper added in v1.23.0

type DataPermTypeCtxHelper = ContextHelper[DataPermType, string]

type DecodeFunc added in v0.28.0

type DecodeFunc[T ParamData] func(src T, v any) error

func (DecodeFunc[T]) Decode added in v0.28.0

func (f DecodeFunc[T]) Decode(src T, v any) error

type Decoder added in v0.28.0

type Decoder[T ParamData] interface {
	Decode(src T, v any) error
}

type DoWithCtx added in v0.2.0

type DoWithCtx func(ctx context.Context) error

type Doer added in v0.5.0

type Doer = func(context.Context) (canRetry bool, err error)

type E added in v0.24.0

type E = error

func CallInDefRec2 added in v1.19.0

func CallInDefRec2[P, R any](c C, p P, f func(C, P) (R, E)) (r R, e E)

CallInDefRec2 run f with defer recover to catch panic

func Event added in v0.24.0

func Event[I, O, R any](
	ctx C,
	param I,
	do PipeFunc[I, O],
	success PipeFunc[O, R],
	failed PipeFunc[E, R],
) (r R, err E)

Event do something with input I, handle result with success or failed

func Pipe added in v0.24.0

func Pipe[B, D, A, R any](
	ctx C,
	b B,
	before PipeFunc[B, D],
	do PipeFunc[D, A],
	after PipeFunc[A, R],
) (r R, err E)

Pipe is a pipe run the PipeFuncs in order

func Pipes added in v1.7.0

func Pipes[B, D, A, R any](
	ctx C,
	b B,
	before Piper[B, D],
	do Piper[D, A],
	after Piper[A, R],
) (r R, e E)

func RunIf added in v1.9.0

func RunIf[P, R any, F LogicSet[P, R]](cond bool, ctx C, param P, f F) (r R, err E)

func RunLogicIf added in v1.10.0

func RunLogicIf[P, R any](cond bool, ctx C, param P, f Logic[P, R]) (r R, err E)

type Entity added in v0.74.0

type Entity[U any] struct {
	Id   U      `json:"id"`   // id
	Name string `json:"name"` // 名称
}

type EntityWithTotal added in v0.62.0

type EntityWithTotal[T any] struct {
	Inner T     // data
	Total int64 `db:"total"` // total
}

EntityWithTotal used to scan col1, col2, col3 to T, and scan total to Total when columns is [col1, col2, col3, total] if *T is interface{ ValuePtrs() []any }

func (*EntityWithTotal[T]) ValuePtrs added in v0.62.0

func (s *EntityWithTotal[T]) ValuePtrs() []any

ValuePtrs return T's fields and Total's pointer if *T is interface{ ValuePtrs() []any }, or return Inner and Total's pointer; use by rows.Scan(s.ValuePtrs()....)

type Enum added in v0.42.0

type Enum[T ~int | ~string] struct {
	Name  string `json:"name"`
	Value T      `json:"value"`
}

type EnvType added in v1.23.0

type EnvType struct{}

环境信息

type EnvTypeCtxHelper added in v1.23.0

type EnvTypeCtxHelper = ContextHelper[EnvType, string]

type Error

type Error[T any] struct {
	// contains filtered or unexported fields
}

Error is a error type with any element

func ConvertError

func ConvertError(v any) (*Error[*e], bool)

func (Error[T]) Error

func (e Error[T]) Error() string

func (Error[T]) Inner

func (e Error[T]) Inner() T

type ErrorHandler added in v0.2.0

type ErrorHandler func(error)

type Escaper added in v1.2.0

type Escaper func(field any) (any, error)

type EventEntity added in v0.25.0

type EventEntity[I, O, R any] struct {
	Param   I
	Do      PipeFunc[I, O]
	Success PipeFunc[O, R]
	Failed  PipeFunc[E, R]

	Handler func(R, E)
}

type EventFunc added in v0.25.0

type EventFunc[I, O, R any] func(
	ctx C,
	param I,
	do PipeFunc[I, O],
	success PipeFunc[O, R],
	failed PipeFunc[E, R],
) (r R, err E)

type Field added in v0.9.0

type Field struct {
	reflect.StructField        // 内嵌反射结构体字段类型
	Comment             string // 注释
	Struct              Struct // 字段的类型是其它结构体
}

type FindFunc added in v0.16.0

type FindFunc[R any] func() (query string, args []any, genObj func(colTypes []*sql.ColumnType) (r *R, fields []any))

FindFunc return query, args, and object generator; object generator should return new object and it's related fields when called; FindFunc is a Finder too.

func FindFuncHelper added in v0.45.0

func FindFuncHelper[T any](
	query string,
	args []any,
	fieldMappers ...func(string) string,
) FindFunc[T]

FindFuncHelper return FindFunc with T

func (FindFunc[R]) NewScanObjAndFields added in v0.16.0

func (f FindFunc[R]) NewScanObjAndFields(colTypes []*sql.ColumnType) (r *R, fields []any)

func (FindFunc[R]) Query added in v0.16.0

func (f FindFunc[R]) Query() (query string, args []any)

type Finder added in v0.2.0

type Finder[R any] interface {
	Queryer

	// new a result type object, not the same, to receive every row
	// fields must be pointer type of result object's field, and it is match with query sql's select column one by one
	NewScanObjAndFields(colTypes []*sql.ColumnType) (r *R, fields []any)
}

type HTTPClientOption added in v0.91.0

type HTTPClientOption struct {
	// contains filtered or unexported fields
}

type HTTPClientSetter added in v0.91.0

type HTTPClientSetter func(*HTTPClientOption)

func HTTPClientSkipVerify added in v0.91.0

func HTTPClientSkipVerify() HTTPClientSetter

func HTTPClientWithTimeout added in v0.91.0

func HTTPClientWithTimeout(timeout time.Duration) HTTPClientSetter

func HTTPClientWithTransport added in v0.91.0

func HTTPClientWithTransport(tp *http.Transport) HTTPClientSetter

type HTTPProxyOption added in v0.27.0

type HTTPProxyOption struct {
	Director       func(req *http.Request)
	ModifyResponse func(r *http.Response) error
	ErrorHandler   func(w http.ResponseWriter, r *http.Request, err error)
}

type HTTPSProxyOption added in v1.14.0

type HTTPSProxyOption struct {
	CertFile, KeyFile     string
	CaCertFile, CaKeyFile string
}

type HandlerFunc added in v0.79.0

type HandlerFunc[T any] func(T)

func (HandlerFunc[T]) HTTPHandlerFunc added in v0.79.0

func (h HandlerFunc[T]) HTTPHandlerFunc(t T) http.HandlerFunc

type Id added in v0.56.0

type Id uint64

Id to/from string when json encode/decode

func (Id) MarshalJSON added in v0.56.0

func (id Id) MarshalJSON() ([]byte, error)

func (*Id) UnmarshalJSON added in v0.56.0

func (id *Id) UnmarshalJSON(data []byte) error

type IdType added in v0.64.0

type IdType[T any] struct {
	Id T `json:"id" form:"id"` // id
}

type IdsType added in v0.72.0

type IdsType[T any] struct {
	Ids []T `json:"ids" form:"ids"` // ids
}

type Interface added in v0.90.0

type Interface interface {
	DeepCopy() interface{}
}

Interface for delegating copy process to type

type Ioc added in v0.29.0

type Ioc struct {
	// contains filtered or unexported fields
}

Ioc Inversion of Control, dependency inject

func NewIoc added in v0.29.0

func NewIoc(
	opt *IocOption,
) *Ioc

func (*Ioc) Inject added in v0.29.0

func (ioc *Ioc) Inject(v any) (err error)

Inject init v with providers. v is a struct pointer.

If provider need parameters, it will lookup a right value by it's type.

func (*Ioc) RegisterProvider added in v0.29.0

func (ioc *Ioc) RegisterProvider(v any) (err error)

RegisterProvider register provider,like `func New(fielda TypeA, fieldb TypeB) (T)`

type IocOption added in v0.29.0

type IocOption struct {
	EnableUnexportedFieldSetValue bool // set value to unexported field
	Print                         bool // print inject procedure
}

type IsAdminType added in v1.23.0

type IsAdminType struct{}

用户是否超管角色

type IsAdminTypeCtxHelper added in v1.23.0

type IsAdminTypeCtxHelper = ContextHelper[IsAdminType, bool]

type Job added in v0.2.0

type Job struct {
	// contains filtered or unexported fields
}

func NewJob added in v0.2.0

func NewJob(do DoWithCtx, timeout time.Duration, eh ErrorHandler) *Job

type KeyOption added in v0.11.0

type KeyOption struct {
	Timeout time.Duration // key will expire when timeout
}

type ListResult added in v0.72.0

type ListResult[T any] struct {
	List []T `json:"list" fakesize:"1"` // list
}

type Logic added in v1.6.0

type Logic[P, R any] func(C, P) (R, E)
var (
	EmptyLogicFunc = func(C, struct{}) (r struct{}, err E) { return }
	NilLogicFunc   Logic[struct{}, struct{}]
)

func LogicFrom added in v1.6.0

func LogicFrom[P, R any](f func(C, P) (R, E)) Logic[P, R]

func LogicFromWE added in v1.10.0

func LogicFromWE[P, R any](f func(C, P) R) Logic[P, R]

func LogicFromWP added in v1.10.0

func LogicFromWP[R any](f func(C) (R, E)) Logic[struct{}, R]

func LogicFromWPE added in v1.10.0

func LogicFromWPE[R any](f func(C) R) Logic[struct{}, R]

func LogicFromWPR added in v1.10.0

func LogicFromWPR(f func(C) E) Logic[struct{}, struct{}]

func LogicFromWPRE added in v1.10.0

func LogicFromWPRE(f func(C)) Logic[struct{}, struct{}]

func LogicFromWR added in v1.10.0

func LogicFromWR[P any](f func(C, P) E) Logic[P, struct{}]

func LogicFromWRE added in v1.10.0

func LogicFromWRE[P any](f func(C, P)) Logic[P, struct{}]

func PipeToLogic added in v1.7.0

func PipeToLogic[I, O any](pf PipeFunc[I, O]) Logic[I, O]

func (Logic[P, R]) ToLogic added in v1.7.0

func (l Logic[P, R]) ToLogic() Logic[P, R]

type LogicSet added in v1.8.0

type LogicSet[P, R any] interface {
	func(C, P) (R, E) |
		Logic[P, R] |
		LogicWithoutParam[R] |
		LogicWithoutResult[P] |
		LogicWithoutPR |
		LogicWithoutError[P, R] |
		LogicWithoutParamError[R] |
		LogicWithoutResultError[P] |
		LogicWithoutParamResultError
}

type LogicWithoutError added in v1.6.0

type LogicWithoutError[P, R any] func(C, P) R

func LogicWE added in v1.6.0

func LogicWE[P, R any](f func(C, P) R) LogicWithoutError[P, R]

func (LogicWithoutError[P, R]) ToLogic added in v1.6.0

func (l LogicWithoutError[P, R]) ToLogic() Logic[P, R]

type LogicWithoutPR added in v1.6.0

type LogicWithoutPR func(C) E

func LogicWPR added in v1.6.0

func LogicWPR(f func(C) E) LogicWithoutPR

func (LogicWithoutPR) ToLogic added in v1.6.0

func (l LogicWithoutPR) ToLogic() Logic[struct{}, struct{}]

type LogicWithoutParam added in v1.6.0

type LogicWithoutParam[R any] func(C) (R, E)

func LogicWP added in v1.6.0

func LogicWP[R any](f func(C) (R, E)) LogicWithoutParam[R]

func (LogicWithoutParam[R]) ToLogic added in v1.6.0

func (l LogicWithoutParam[R]) ToLogic() Logic[struct{}, R]

type LogicWithoutParamError added in v1.6.0

type LogicWithoutParamError[R any] func(C) R

func LogicWPE added in v1.6.0

func LogicWPE[R any](f func(C) R) LogicWithoutParamError[R]

func (LogicWithoutParamError[R]) ToLogic added in v1.6.0

func (l LogicWithoutParamError[R]) ToLogic() Logic[struct{}, R]

type LogicWithoutParamResultError added in v1.6.0

type LogicWithoutParamResultError func(C)

func LogicWPRE added in v1.6.0

func LogicWPRE(f func(C)) LogicWithoutParamResultError

func (LogicWithoutParamResultError) ToLogic added in v1.6.0

func (l LogicWithoutParamResultError) ToLogic() Logic[struct{}, struct{}]

type LogicWithoutResult added in v1.6.0

type LogicWithoutResult[P any] func(C, P) E

func LogicWR added in v1.6.0

func LogicWR[P any](f func(C, P) E) LogicWithoutResult[P]

func (LogicWithoutResult[P]) ToLogic added in v1.6.0

func (l LogicWithoutResult[P]) ToLogic() Logic[P, struct{}]

type LogicWithoutResultError added in v1.6.0

type LogicWithoutResultError[P any] func(C, P)

func LogicWRE added in v1.6.0

func LogicWRE[P any](f func(C, P)) LogicWithoutResultError[P]

func (LogicWithoutResultError[P]) ToLogic added in v1.6.0

func (l LogicWithoutResultError[P]) ToLogic() Logic[P, struct{}]

type Map added in v0.6.0

type Map[K comparable, T any] struct {
	// contains filtered or unexported fields
}

func NewMap added in v0.6.0

func NewMap[K comparable, T any](size ...int) *Map[K, T]

func (*Map[K, T]) Get added in v0.6.0

func (m *Map[K, T]) Get(key K) (value T)

func (*Map[K, T]) Insert added in v0.6.0

func (m *Map[K, T]) Insert(key K, value T, opts ...*KeyOption)

func (*Map[K, T]) Lookup added in v0.6.0

func (m *Map[K, T]) Lookup(key K) (value T, ok bool)

func (*Map[K, T]) Range added in v0.6.0

func (m *Map[K, T]) Range(f func(key K, value T))

func (*Map[K, T]) Remove added in v0.6.0

func (m *Map[K, T]) Remove(key K)

type NotSaveCtxHelper added in v1.23.0

type NotSaveCtxHelper = ContextHelper[NotSaveType, bool]

type NotSaveType added in v1.23.0

type NotSaveType struct{}

无需保存标记

type PageCond added in v1.23.0

type PageCond[T, C any] struct {
	Table T

	Cond C
}

func PageCondFrom added in v1.23.0

func PageCondFrom[T, C any](t T, c C) (p PageCond[T, C])

func (PageCond[T, C]) Unpack added in v1.23.0

func (p PageCond[T, C]) Unpack() (T, C)

type PageResult added in v0.63.0

type PageResult[T any] struct {
	Total int64 `json:"total"` // total

	ListResult[T]
}

type Pager added in v0.56.0

type Pager struct {
	Page     int `json:"page" form:"page"`         // page No.
	PageSize int `json:"pageSize" form:"pageSize"` // page size
}

func (Pager) Limit added in v1.8.0

func (p Pager) Limit() int

func (Pager) Offset added in v1.8.0

func (p Pager) Offset() int

type ParamData added in v0.28.0

type ParamData interface {
	url.Values | []byte
}

type ParamParser added in v0.28.0

type ParamParser[T ParamData] struct {
	// contains filtered or unexported fields
}

func NewParamParser added in v0.28.0

func NewParamParser[T ParamData](decoder Decoder[T]) *ParamParser[T]

func (*ParamParser[T]) Parse added in v0.28.0

func (p *ParamParser[T]) Parse(data T, v any) error

Parse parse data to v with decoder.

func (*ParamParser[T]) ParseAndCheck added in v0.28.0

func (p *ParamParser[T]) ParseAndCheck(ctx context.Context, data T, v any) error

ParseAndCheck parse data to v with decoder and check v if v implement interface{ Check(context.Context) error } or interface{ Check() error }.

type Password added in v0.56.0

type Password string

func (Password) Compare added in v0.56.0

func (p Password) Compare(hash string) error

Compare 使用bcrypt算法判断密码是否与传入hash值匹配

func (Password) Encrypt added in v0.56.0

func (p Password) Encrypt() (pp string, err error)

Encrypt 使用bcrypt算法将明文密码哈希得到hash字符串 bcrypt算法在对同一个密码哈希多次会得出不同结果,极大的保证了用户密码的安全

func (Password) String added in v0.56.0

func (p Password) String() string

Password 实现String方法,打印时自动替换为*

type PipeFunc added in v0.24.0

type PipeFunc[I, O any] func(C, I) (O, E)

func PipeFrom added in v1.7.0

func PipeFrom[I, O any](f func(C, I) (O, E)) PipeFunc[I, O]

func PipeFromLogic added in v1.7.0

func PipeFromLogic[I, O any](logic Logic[I, O]) PipeFunc[I, O]

func (PipeFunc[I, O]) Run added in v1.7.0

func (pf PipeFunc[I, O]) Run(c C, i I) (r O, e E)

type Piper added in v1.7.0

type Piper[I, O any] interface {
	Run(C, I) (O, E)
}

type ProxyContext added in v0.13.0

type ProxyContext struct {
	PkgPath       string
	InterfaceName string
	MethodName    string
}

每个包、每个接口、每个方法唯一对应一个方法

func (ProxyContext) IsEmpty added in v0.13.0

func (pctx ProxyContext) IsEmpty() bool

func (ProxyContext) LogShortf added in v0.13.0

func (pctx ProxyContext) LogShortf(format string, args ...any)

func (ProxyContext) Logf added in v0.13.0

func (pctx ProxyContext) Logf(format string, args ...any)

func (ProxyContext) String added in v0.13.0

func (pctx ProxyContext) String() string

func (ProxyContext) Uniq added in v0.13.0

func (pctx ProxyContext) Uniq() string

type ProxyCtxFunc added in v0.13.0

type ProxyCtxFunc func(ctx ProxyContext, method any, args []any) (res []any)

ProxyCtxFunc 对于method: func(string, int) (int, error) f := method.(func(string, int) (int, error)) a1 := args[0].(string) a2 := args[1].(int) r1, r2 := f(a1, a2) res = append(res, r1, r2)

type ProxyCtxFuncStore added in v0.13.0

type ProxyCtxFuncStore struct {
	// contains filtered or unexported fields
}

func GlobalProxyCtxMap added in v0.14.0

func GlobalProxyCtxMap() *ProxyCtxFuncStore

func NewProxyCtxMap added in v0.13.0

func NewProxyCtxMap() *ProxyCtxFuncStore

func (*ProxyCtxFuncStore) Lookup added in v0.13.0

func (m *ProxyCtxFuncStore) Lookup(pctx ProxyContext, typeParams ...string) (ProxyCtxFunc, bool)

func (*ProxyCtxFuncStore) Set added in v0.13.0

func (m *ProxyCtxFuncStore) Set(pctx ProxyContext, f ProxyCtxFunc, typeParams ...string)

type Queryer added in v0.35.0

type Queryer interface {
	// return query sql and args
	Query() (query string, args []any)
}

type RemoteAddrType added in v1.23.0

type RemoteAddrType struct{}

远程地址

type RemoteAddrTypeCtxHelper added in v1.23.0

type RemoteAddrTypeCtxHelper = ContextHelper[RemoteAddrType, string]

type RequestKeyType added in v1.23.0

type RequestKeyType = TraceKey

请求

type RequestKeyTypeCtxHelper added in v1.23.0

type RequestKeyTypeCtxHelper = ContextHelper[RequestKeyType, string]

type RespHeaderExtractor added in v0.21.0

type RespHeaderExtractor interface {
	Extract(h http.Header)
}

type ResultExtractor added in v0.2.0

type ResultExtractor[R any] func(data []byte) (R, error)

type Route added in v0.79.0

type Route[T any] struct {
	Method  string
	Path    string
	Comment string
	Opt     *RouteOption
	Handler HandlerFunc[T]
	Childs  []*Route[T]
}

func NewRoute added in v0.79.0

func NewRoute[T any](method, path, comment string, h HandlerFunc[T], childs ...*Route[T]) *Route[T]

func (*Route[T]) SetChilds added in v0.79.0

func (r *Route[T]) SetChilds(childs ...*Route[T]) *Route[T]

func (*Route[T]) WithChilds added in v0.79.0

func (r *Route[T]) WithChilds(childs ...*Route[T]) *Route[T]

func (*Route[T]) WithOption added in v0.92.0

func (r *Route[T]) WithOption(opt *RouteOption) *Route[T]

type RouteHandler added in v0.34.0

type RouteHandler[P, R any] interface {
	Parse(req *http.Request, p *P) error
	Write(w http.ResponseWriter, r R, err error)
}

type RouteOption added in v0.92.0

type RouteOption struct {
	NeedLogin bool // 是否需要登录

	ParamFormat  string // json | xml
	ResultFormat string // json | xml
	UseBody      bool   // 使用body传递参数
}

type RouteRegister added in v0.34.0

type RouteRegister interface {
	Handle(method, path string, handlers http.HandlerFunc)
}

type Settings added in v0.30.0

type Settings struct {
	Name          string
	MaxRequests   uint32
	Interval      time.Duration
	Timeout       time.Duration
	ReadyToTrip   func(counts Counts) bool
	OnStateChange func(name string, from State, to State)
	IsSuccessful  func(err error) bool
}

Settings configures CircuitBreaker:

Name is the name of the CircuitBreaker.

MaxRequests is the maximum number of requests allowed to pass through when the CircuitBreaker is half-open. If MaxRequests is 0, the CircuitBreaker allows only 1 request.

Interval is the cyclic period of the closed state for the CircuitBreaker to clear the internal Counts. If Interval is less than or equal to 0, the CircuitBreaker doesn't clear internal Counts during the closed state.

Timeout is the period of the open state, after which the state of the CircuitBreaker becomes half-open. If Timeout is less than or equal to 0, the timeout value of the CircuitBreaker is set to 60 seconds.

ReadyToTrip is called with a copy of Counts whenever a request fails in the closed state. If ReadyToTrip returns true, the CircuitBreaker will be placed into the open state. If ReadyToTrip is nil, default ReadyToTrip is used. Default ReadyToTrip returns true when the number of consecutive failures is more than 5.

OnStateChange is called whenever the state of the CircuitBreaker changes.

IsSuccessful is called with the error returned from a request. If IsSuccessful returns true, the error is counted as a success. Otherwise the error is counted as a failure. If IsSuccessful is nil, default IsSuccessful is used, which returns false for all non-nil errors.

type Signer added in v1.0.0

type Signer struct {
	// contains filtered or unexported fields
}

func NewSigner added in v1.0.0

func NewSigner(secret string) *Signer

NewSigner which secret is base64 encoded

secret can use `ssh-keygen -t rsa -b 2048 -m PKCS8 -f jwtRS256.key` to generate, it will generate `jwtRS256.key` and `jwtRS256.key.pub`, and the first file is what we want

func (*Signer) Sign added in v1.0.0

func (s *Signer) Sign(raw []byte) (r string, err error)

Sign return raw's signature which is base64 encoded

type SingleFlightCall added in v0.6.0

type SingleFlightCall[R any] func() (R, error)

type Slice added in v0.6.0

type Slice[T any] struct {
	// contains filtered or unexported fields
}

func NewSlice added in v0.6.0

func NewSlice[T any](lenAndCap ...int) *Slice[T]

func (*Slice[T]) Append added in v0.6.0

func (s *Slice[T]) Append(values ...T)

func (*Slice[T]) Index added in v0.6.0

func (s *Slice[T]) Index(i int) T

func (*Slice[T]) Range added in v0.6.0

func (s *Slice[T]) Range(f func(item T, index int))

func (*Slice[T]) Reset added in v0.6.0

func (s *Slice[T]) Reset(lenAndCap ...int)

type State added in v0.30.0

type State int

State is a type that represents a state of CircuitBreaker.

const (
	StateClosed State = iota
	StateHalfOpen
	StateOpen
)

These constants are states of CircuitBreaker.

func (State) String added in v0.30.0

func (s State) String() string

String implements stringer interface.

type StateFunc added in v0.82.0

type StateFunc[S comparable] func(pre S) S

type StateMachine added in v0.82.0

type StateMachine[S comparable] struct {
	// contains filtered or unexported fields
}

func NewStateMachine added in v0.82.0

func NewStateMachine[S comparable](states []S) *StateMachine[S]

func NewStateMachineByMap added in v0.82.0

func NewStateMachineByMap[S comparable](m map[S]StateFunc[S]) *StateMachine[S]

func (*StateMachine[S]) Run added in v0.82.0

func (m *StateMachine[S]) Run(s S) S

func (*StateMachine[S]) WithFunc added in v0.82.0

func (m *StateMachine[S]) WithFunc(s S, f StateFunc[S])

type Storer added in v0.2.0

type Storer interface {
	*sql.DB | *sql.Tx | *sql.Conn
	QueryContext(ctx context.Context, query string, args ...any) (*sql.Rows, error)
	ExecContext(ctx context.Context, query string, args ...any) (sql.Result, error)
}

type Struct added in v0.9.0

type Struct struct {
	Name        string       // 名字
	Comment     string       // 注释
	Description string       // 描述
	Type        reflect.Type // 反射类型
	Fields      []Field      // 结构体字段
}

func MakeStruct added in v0.9.0

func MakeStruct() Struct

func ResolveStruct added in v0.9.0

func ResolveStruct(value any) (Struct, error)

func ResolveStructSlice added in v1.5.0

func ResolveStructSlice(value any) ([]Struct, error)

func (Struct) GetFields added in v0.9.0

func (s Struct) GetFields() []Field

GetFields return all field in struct, include anonymous fields

type StructCommentEntity added in v0.9.0

type StructCommentEntity struct {
	StructName    string
	StructComment map[string]string
	FieldComment  map[string]string
}

type TimeTracer added in v0.13.0

type TimeTracer struct {
	// contains filtered or unexported fields
}

func (*TimeTracer) Begin added in v0.13.0

func (impl *TimeTracer) Begin()

func (*TimeTracer) New added in v0.13.0

func (impl *TimeTracer) New(pctx ProxyContext, extras ...any) Tracer

func (*TimeTracer) Stop added in v0.13.0

func (impl *TimeTracer) Stop(_ ...any)

type TimestampType added in v1.23.0

type TimestampType struct{}

时间戳

type TimestampTypeCtxHelper added in v1.23.0

type TimestampTypeCtxHelper = ContextHelper[TimestampType, int64]

type ToLogic added in v1.7.0

type ToLogic[P, R any] interface {
	ToLogic() Logic[P, R]
}

type Token added in v0.57.0

type Token[T any] struct {
	// contains filtered or unexported fields
}

func New added in v0.57.0

func New[T any](
	secret []byte,
	exp time.Duration,
	issuer string,
) *Token[T]

func (*Token[T]) Sign added in v0.57.0

func (t *Token[T]) Sign(user T) (string, error)

Sign `user` can be a id or an object

func (*Token[T]) Verify added in v0.57.0

func (t *Token[T]) Verify(tokenString string) (user T, err error)

type TraceId added in v0.26.0

type TraceId string

type TraceKey added in v0.22.0

type TraceKey struct{}

type Tracer added in v0.13.0

type Tracer interface {
	New(pctx ProxyContext, extras ...any) Tracer // 新建Tracer,每个方法调用均新建一个
	Begin()
	Stop(args ...any)
}

type TreeEntity added in v0.74.0

type TreeEntity[U any] struct {
	Entity[U]

	Childs []Entity[U] `json:"childs"` // 子元素
}

type TwoStepCircuitBreaker added in v0.30.0

type TwoStepCircuitBreaker[P, R any] struct {
	// contains filtered or unexported fields
}

TwoStepCircuitBreaker is like CircuitBreaker but instead of surrounding a function with the breaker functionality, it only checks whether a request can proceed and expects the caller to report the outcome in a separate step using a callback.

func NewTwoStepCircuitBreaker added in v0.30.0

func NewTwoStepCircuitBreaker[P, R any](st Settings) *TwoStepCircuitBreaker[P, R]

NewTwoStepCircuitBreaker returns a new TwoStepCircuitBreaker configured with the given Settings.

func (*TwoStepCircuitBreaker[P, R]) Allow added in v0.30.0

func (tscb *TwoStepCircuitBreaker[P, R]) Allow() (done func(success bool), err error)

Allow checks if a new request can proceed. It returns a callback that should be used to register the success or failure in a separate step. If the circuit breaker doesn't allow requests, it returns an error.

func (*TwoStepCircuitBreaker[P, R]) Counts added in v0.30.0

func (tscb *TwoStepCircuitBreaker[P, R]) Counts() Counts

Counts returns internal counters

func (*TwoStepCircuitBreaker[P, R]) Name added in v0.30.0

func (tscb *TwoStepCircuitBreaker[P, R]) Name() string

Name returns the name of the TwoStepCircuitBreaker.

func (*TwoStepCircuitBreaker[P, R]) State added in v0.30.0

func (tscb *TwoStepCircuitBreaker[P, R]) State() State

State returns the current state of the TwoStepCircuitBreaker.

type UserKeyType added in v1.23.0

type UserKeyType struct{}

用户

type UserKeyTypeCtxHelper added in v1.23.0

type UserKeyTypeCtxHelper = ContextHelper[UserKeyType, uint64]

type Worker added in v0.2.0

type Worker struct {
	// contains filtered or unexported fields
}

func NewWorker added in v0.2.0

func NewWorker(n int) *Worker

NewWorker new a worker with limit number

func (*Worker) Push added in v0.2.0

func (w *Worker) Push(job Job) error

func (*Worker) Start added in v0.2.0

func (w *Worker) Start()

func (*Worker) Stop added in v0.2.0

func (w *Worker) Stop()

Directories

Path Synopsis
cmd
letgo Module

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL