更新任务条件

This commit is contained in:
wh_zcy 2022-09-16 17:53:56 +08:00
parent 3ab87cbc56
commit 20db79f117
8 changed files with 152 additions and 75 deletions

View File

@ -654,7 +654,7 @@ var (
Enabled: true,
},
ff(comm.ModuleRtask, "rtest"): {
NavLabel: "测试",
NavLabel: "测试条件",
Desc: "测试任务触发",
MainType: string(comm.ModuleRtask),
SubType: "rtest",

View File

@ -73,7 +73,7 @@ func (this *apiComp) Choose(session comm.IUserSession, req *pb.RtaskChooseReq) (
return
}
if chooseCnf.GotoLevel == 0 {
if chooseCnf.NextTid != 0 {
// 更新完成的任务
frtaskArr.RtaskIds = append(frtaskArr.RtaskIds, req.RtaskId)
if rtask.FrtaskIds == nil {
@ -87,13 +87,21 @@ func (this *apiComp) Choose(session comm.IUserSession, req *pb.RtaskChooseReq) (
code = pb.ErrorCode_SystemError
return
}
// 发奖励
code = this.moduleRtask.DispenseRes(session, sideConf.Reward, true)
rsp := &pb.RtaskFinishPush{
RtaskId: req.RtaskId,
}
if err := session.SendMsg(string(this.moduleRtask.GetType()), RtaskSubTypeChoose, rsp); err != nil {
code = pb.ErrorCode_SystemError
}
}
rsp := &pb.RtaskChooseResp{
RtaskId: req.RtaskId,
ChooseId: req.ChooseId,
}
if err := session.SendMsg(string(this.moduleRtask.GetType()), RtaskSubTypeChoose, rsp); err != nil {
code = pb.ErrorCode_SystemError
}

View File

@ -3,13 +3,39 @@ package rtask
import cfg "go_dreamfactory/sys/configure/structs"
func (this *ModelRtaskRecord) equalFirstParam(cfg *cfg.GameRdtaskCondiData, vals ...int32) (condiId int32) {
//只查询参数于配置相等的情况下设置condiId否则返回0
if !soEqual(vals[0], cfg.Data1) {
return
}
condiId = cfg.Id
return
}
func (this *ModelRtaskRecord) greatEqualFirstParam(cfg *cfg.GameRdtaskCondiData, vals ...int32) (condiId int32) {
if !soGreatEqual(vals[0], cfg.Data1) {
return
}
condiId = cfg.Id
return
}
func (this *ModelRtaskRecord) lessEqualFirstParam(cfg *cfg.GameRdtaskCondiData, vals ...int32) (condiId int32) {
if !soLessEqual(vals[0], cfg.Data1) {
return
}
condiId = cfg.Id
return
}
// 与每个参数比较
// Deprecated
func (this *ModelRtaskRecord) equalParams(cfg *cfg.GameRdtaskCondiData, vals ...int32) (condiId int32) {
var (
err error
paramLen int
)
if paramLen, err = verifyParam(cfg, vals...); err != nil {
if paramLen, err = lenParam(cfg, vals...); err != nil {
return
}
@ -19,21 +45,21 @@ func (this *ModelRtaskRecord) equalParams(cfg *cfg.GameRdtaskCondiData, vals ...
return
}
case 2:
if !(soEqual(vals[0], cfg.Data1) && soEqual(vals[1], cfg.Data2)) {
if !(soEqual(vals[0], cfg.Data1) && soGreatEqual(vals[1], cfg.Data2)) {
return
}
case 3:
if !(soEqual(vals[0], cfg.Data1) && soEqual(vals[1], cfg.Data2) && soEqual(vals[2], cfg.Data3)) {
if !(soEqual(vals[0], cfg.Data1) && soGreatEqual(vals[1], cfg.Data2) && soGreatEqual(vals[2], cfg.Data3)) {
return
}
case 4:
if !(soEqual(vals[0], cfg.Data1) && soEqual(vals[1], cfg.Data2) &&
soEqual(vals[2], cfg.Data3) && soEqual(vals[3], cfg.Data4)) {
if !(soEqual(vals[0], cfg.Data1) && soGreatEqual(vals[1], cfg.Data2) &&
soGreatEqual(vals[2], cfg.Data3) && soGreatEqual(vals[3], cfg.Data4)) {
return
}
case 5:
if !(soEqual(vals[0], cfg.Data1) && soEqual(vals[1], cfg.Data2) &&
soEqual(vals[2], cfg.Data3) && soEqual(vals[3], cfg.Data4) && soEqual(vals[4], cfg.Data5)) {
if !(soEqual(vals[0], cfg.Data1) && soGreatEqual(vals[1], cfg.Data2) &&
soGreatEqual(vals[2], cfg.Data3) && soGreatEqual(vals[3], cfg.Data4) && soGreatEqual(vals[4], cfg.Data5)) {
return
}
default:
@ -50,30 +76,30 @@ func (this *ModelRtaskRecord) greatThanParams(cfg *cfg.GameRdtaskCondiData, vals
err error
paramLen int
)
if paramLen, err = verifyParam(cfg, vals...); err != nil {
if paramLen, err = lenParam(cfg, vals...); err != nil {
return
}
switch paramLen {
case 1:
if !soGreatThan(vals[0], cfg.Data1) {
if !soGreatEqual(vals[0], cfg.Data1) {
return
}
case 2:
if !(soGreatThan(vals[0], cfg.Data1) && soEqual(vals[1], cfg.Data2)) {
if !(soGreatEqual(vals[0], cfg.Data1) && soEqual(vals[1], cfg.Data2)) {
return
}
case 3:
if !(soGreatThan(vals[0], cfg.Data1) && soEqual(vals[1], cfg.Data2) && soEqual(vals[2], cfg.Data3)) {
if !(soGreatEqual(vals[0], cfg.Data1) && soEqual(vals[1], cfg.Data2) && soEqual(vals[2], cfg.Data3)) {
return
}
case 4:
if !(soGreatThan(vals[0], cfg.Data1) && soEqual(vals[1], cfg.Data2) &&
if !(soGreatEqual(vals[0], cfg.Data1) && soEqual(vals[1], cfg.Data2) &&
soEqual(vals[2], cfg.Data3) && soEqual(vals[3], cfg.Data4)) {
return
}
case 5:
if !(soGreatThan(vals[0], cfg.Data1) && soEqual(vals[1], cfg.Data2) &&
if !(soGreatEqual(vals[0], cfg.Data1) && soEqual(vals[1], cfg.Data2) &&
soEqual(vals[2], cfg.Data3) && soEqual(vals[3], cfg.Data4) && soEqual(vals[4], cfg.Data5)) {
return
}
@ -91,31 +117,31 @@ func (this *ModelRtaskRecord) lessThanParams(cfg *cfg.GameRdtaskCondiData, vals
err error
paramLen int
)
if paramLen, err = verifyParam(cfg, vals...); err != nil {
if paramLen, err = lenParam(cfg, vals...); err != nil {
return
}
switch paramLen {
case 1:
if !soLessThan(vals[0], cfg.Data1) {
if !soLessEqual(vals[0], cfg.Data1) {
return
}
case 2:
if !(soLessThan(vals[0], cfg.Data1) && soEqual(vals[1], cfg.Data2)) {
if !(soLessEqual(vals[0], cfg.Data1) && soGreatEqual(vals[1], cfg.Data2)) {
return
}
case 3:
if !(soLessThan(vals[0], cfg.Data1) && soEqual(vals[1], cfg.Data2) && soEqual(vals[2], cfg.Data3)) {
if !(soLessEqual(vals[0], cfg.Data1) && soGreatEqual(vals[1], cfg.Data2) && soGreatEqual(vals[2], cfg.Data3)) {
return
}
case 4:
if !(soLessThan(vals[0], cfg.Data1) && soEqual(vals[1], cfg.Data2) &&
soEqual(vals[2], cfg.Data3) && soEqual(vals[3], cfg.Data4)) {
if !(soLessEqual(vals[0], cfg.Data1) && soGreatEqual(vals[1], cfg.Data2) &&
soGreatEqual(vals[2], cfg.Data3) && soGreatEqual(vals[3], cfg.Data4)) {
return
}
case 5:
if !(soLessThan(vals[0], cfg.Data1) && soEqual(vals[1], cfg.Data2) &&
soEqual(vals[2], cfg.Data3) && soEqual(vals[3], cfg.Data4) && soEqual(vals[4], cfg.Data5)) {
if !(soLessEqual(vals[0], cfg.Data1) && soGreatEqual(vals[1], cfg.Data2) &&
soGreatEqual(vals[2], cfg.Data3) && soGreatEqual(vals[3], cfg.Data4) && soGreatEqual(vals[4], cfg.Data5)) {
return
}
default:

View File

@ -9,10 +9,10 @@ import (
"github.com/pkg/errors"
)
func verifyParam(cfg *cfg.GameRdtaskCondiData, vals ...int32) (n int, err error) {
func lenParam(cfg *cfg.GameRdtaskCondiData, vals ...int32) (n int, err error) {
if cfg.Data1 != 0 && cfg.Data2 != 0 && cfg.Data3 != 0 && cfg.Data4 != 0 && cfg.Data5 != 0 {
if len(vals) != 5 {
err = errors.New(fmt.Sprintf("参数个数不一致,期望5实际是%v", len(vals)))
err = errors.New(fmt.Sprintf("%v 参数个数不一致,期望5实际是%v", cfg.Id, len(vals)))
return
} else {
n = len(vals)
@ -22,7 +22,7 @@ func verifyParam(cfg *cfg.GameRdtaskCondiData, vals ...int32) (n int, err error)
if cfg.Data1 != 0 && cfg.Data2 != 0 && cfg.Data3 != 0 && cfg.Data4 != 0 {
if len(vals) != 4 {
err = errors.New(fmt.Sprintf("参数个数不一致,期望4实际是%v", len(vals)))
err = errors.New(fmt.Sprintf("%v 参数个数不一致,期望4实际是%v", cfg.Id, len(vals)))
return
} else {
n = len(vals)
@ -32,7 +32,7 @@ func verifyParam(cfg *cfg.GameRdtaskCondiData, vals ...int32) (n int, err error)
if cfg.Data1 != 0 && cfg.Data2 != 0 && cfg.Data3 != 0 {
if len(vals) != 3 {
err = errors.New(fmt.Sprintf("参数个数不一致,期望3实际是%v", len(vals)))
err = errors.New(fmt.Sprintf("%v 参数个数不一致,期望3实际是%v", cfg.Id, len(vals)))
return
} else {
n = len(vals)
@ -42,7 +42,7 @@ func verifyParam(cfg *cfg.GameRdtaskCondiData, vals ...int32) (n int, err error)
if cfg.Data1 != 0 && cfg.Data2 != 0 {
if len(vals) != 2 {
err = errors.New(fmt.Sprintf("参数个数不一致,期望2实际是%v", len(vals)))
err = errors.New(fmt.Sprintf("%v 参数个数不一致,期望2实际是%v", cfg.Id, len(vals)))
return
} else {
n = len(vals)
@ -52,7 +52,7 @@ func verifyParam(cfg *cfg.GameRdtaskCondiData, vals ...int32) (n int, err error)
if cfg.Data1 != 0 {
if len(vals) != 1 {
err = errors.New(fmt.Sprintf("参数个数不一致,期望1实际是%v", len(vals)))
err = errors.New(fmt.Sprintf("%v 参数个数不一致,期望1实际是%v", cfg.Id, len(vals)))
return
} else {
n = len(vals)
@ -139,15 +139,18 @@ type Num interface {
~int32 | ~string | ~bool
}
// 等于
func equal[T Num](actual, expected T) bool {
return actual == expected
}
func greatThan(actual, expected int32) bool {
// 大于等于
func greatEual(actual, expected int32) bool {
return actual >= expected
}
func lessThan(actual, expected int32) bool {
//小于等于
func lessEqual(actual, expected int32) bool {
return actual <= expected
}
@ -160,8 +163,8 @@ func soEqual[T Num](actual T, expected T) (ok bool) {
return
}
func soGreatThan(actual, expected int32) (ok bool) {
if !greatThan(actual, expected) {
func soGreatEqual(actual, expected int32) (ok bool) {
if !greatEual(actual, expected) {
log.Debugf("实际:%v 期望:%v", actual, expected)
return
}
@ -169,8 +172,8 @@ func soGreatThan(actual, expected int32) (ok bool) {
return
}
func soLessThan(actual, expected int32) (ok bool) {
if !lessThan(actual, expected) {
func soLessEqual(actual, expected int32) (ok bool) {
if !lessEqual(actual, expected) {
log.Debugf("实际:%v 期望:%v", actual, expected)
return
}

View File

@ -125,11 +125,23 @@ func (this *ModuleRtask) initRtaskVerifyHandle() {
cfg: typeCfg,
verify: this.modelRtask.verfiyRtype10,
})
case comm.Rtype12, comm.Rtype13, comm.Rtype14, comm.Rtype15:
case comm.Rtype11:
this.registerVerifyHandle(v.Id, &rtaskCondi{
cfg: typeCfg,
find: this.modelRtaskRecord.lessThanParams,
verify: this.modelRtaskRecord.verifyFromDb,
find: this.modelRtaskRecord.lessEqualFirstParam,
verify: this.modelRtaskRecord.verifyFirstGreatEqualParam,
update: this.modelRtaskRecord.overrideUpdate,
})
case comm.Rtype12, comm.Rtype13, comm.Rtype14, comm.Rtype15,
comm.Rtype18, comm.Rtype19, comm.Rtype21, comm.Rtype24,
comm.Rtype26, comm.Rtype27, comm.Rtype28, comm.Rtype38,
comm.Rtype39, comm.Rtype50, comm.Rtype51, comm.Rtype53,
comm.Rtype54, comm.Rtype57, comm.Rtype58, comm.Rtype60,
comm.Rtype62, comm.Rtype64, comm.Rtype69:
this.registerVerifyHandle(v.Id, &rtaskCondi{
cfg: typeCfg,
find: this.modelRtaskRecord.lessEqualFirstParam,
verify: this.modelRtaskRecord.verifyFirstGreatEqualParam,
update: this.modelRtaskRecord.addUpdate,
})
case comm.Rtype20:
@ -137,8 +149,20 @@ func (this *ModuleRtask) initRtaskVerifyHandle() {
cfg: typeCfg,
verify: this.modelRtask.verifyRtype20,
})
case comm.Rtype11, comm.Rtype16, comm.Rtype17, comm.Rtype21,
comm.Rtype22, comm.Rtype35, comm.Rtype40, comm.Rtype44,
case comm.Rtype22:
this.registerVerifyHandle(v.Id, &rtaskCondi{
cfg: typeCfg,
find: this.modelRtaskRecord.equalFirstParam,
verify: this.modelRtaskRecord.verifyFirstEqualParam,
update: this.modelRtaskRecord.overrideUpdate,
})
case comm.Rtype63:
this.registerVerifyHandle(v.Id, &rtaskCondi{
cfg: typeCfg,
verify: this.modelRtask.verifyRtype63,
})
case comm.Rtype16, comm.Rtype17,
comm.Rtype35, comm.Rtype44,
comm.Rtype59, comm.Rtype61, comm.Rtype70:
this.registerVerifyHandle(v.Id, &rtaskCondi{
cfg: typeCfg,
@ -146,28 +170,20 @@ func (this *ModuleRtask) initRtaskVerifyHandle() {
verify: this.modelRtaskRecord.verifyFromDb,
update: this.modelRtaskRecord.overrideUpdate,
})
case comm.Rtype18, comm.Rtype19, comm.Rtype23, comm.Rtype24,
comm.Rtype25, comm.Rtype26, comm.Rtype27,
comm.Rtype28, comm.Rtype29, comm.Rtype30, comm.Rtype31,
case comm.Rtype23, comm.Rtype25, comm.Rtype29, comm.Rtype30, comm.Rtype31,
comm.Rtype32, comm.Rtype33, comm.Rtype34, comm.Rtype36,
comm.Rtype37, comm.Rtype38, comm.Rtype39, comm.Rtype41,
comm.Rtype37, comm.Rtype40, comm.Rtype41,
comm.Rtype42, comm.Rtype43, comm.Rtype45,
comm.Rtype46, comm.Rtype47, comm.Rtype48, comm.Rtype49,
comm.Rtype50, comm.Rtype51, comm.Rtype52, comm.Rtype53,
comm.Rtype54, comm.Rtype55, comm.Rtype56, comm.Rtype57,
comm.Rtype58, comm.Rtype60, comm.Rtype62, comm.Rtype64,
comm.Rtype65, comm.Rtype66, comm.Rtype67, comm.Rtype68, comm.Rtype69:
comm.Rtype52, comm.Rtype55, comm.Rtype56,
comm.Rtype65, comm.Rtype66, comm.Rtype67, comm.Rtype68:
this.registerVerifyHandle(v.Id, &rtaskCondi{
cfg: typeCfg,
find: this.modelRtaskRecord.lessThanParams,
verify: this.modelRtaskRecord.verifyFromDb,
update: this.modelRtaskRecord.addUpdate,
})
case comm.Rtype63:
this.registerVerifyHandle(v.Id, &rtaskCondi{
cfg: typeCfg,
verify: this.modelRtask.verifyRtype63,
})
default:
log.Warnf("rtaskType[%v] not register", typeCfg.Type)
}

View File

@ -14,7 +14,7 @@ import (
// 覆盖更新
func (this *ModelRtaskRecord) overrideUpdate(uid string, cfg *cfg.GameRdtaskCondiData, vals ...int32) (err error) {
var paramLen int
if paramLen, err = verifyParam(cfg, vals...); err != nil {
if paramLen, err = lenParam(cfg, vals...); err != nil {
return err
}

View File

@ -19,18 +19,19 @@ func (this *ModelRtaskRecord) verifyFromDb(uid string, cfg *cfg.GameRdtaskCondiD
return
}
var paramLen int
if paramLen, err = verifyParam(cfg, toArr(rd.Data)...); err == nil {
if paramLen, err = lenParam(cfg, toArr(rd.Data)...); err == nil {
//参数比较,默认第一个参数soGreateEqual,其它soEqual
switch paramLen {
case 1:
return nil, soEqual(rd.Data[0], cfg.Data1)
return nil, soGreatEqual(rd.Data[0], cfg.Data1)
case 2:
return nil, soEqual(rd.Data[0], cfg.Data1) && soEqual(rd.Data[1], cfg.Data2)
return nil, soGreatEqual(rd.Data[0], cfg.Data1) && soEqual(rd.Data[1], cfg.Data2)
case 3:
return nil, soEqual(rd.Data[0], cfg.Data1) && soEqual(rd.Data[1], cfg.Data2) && soEqual(rd.Data[2], cfg.Data3)
return nil, soGreatEqual(rd.Data[0], cfg.Data1) && soEqual(rd.Data[1], cfg.Data2) && soEqual(rd.Data[2], cfg.Data3)
case 4:
return nil, soEqual(rd.Data[0], cfg.Data1) && soEqual(rd.Data[1], cfg.Data2) && soEqual(rd.Data[2], cfg.Data3) && soEqual(rd.Data[3], cfg.Data4)
return nil, soGreatEqual(rd.Data[0], cfg.Data1) && soEqual(rd.Data[1], cfg.Data2) && soEqual(rd.Data[2], cfg.Data3) && soEqual(rd.Data[3], cfg.Data4)
case 5:
return nil, soEqual(rd.Data[0], cfg.Data1) && soEqual(rd.Data[1], cfg.Data2) && soEqual(rd.Data[2], cfg.Data3) &&
return nil, soGreatEqual(rd.Data[0], cfg.Data1) && soEqual(rd.Data[1], cfg.Data2) && soEqual(rd.Data[2], cfg.Data3) &&
soEqual(rd.Data[3], cfg.Data4) && soEqual(rd.Data[4], cfg.Data5)
}
}
@ -38,6 +39,32 @@ func (this *ModelRtaskRecord) verifyFromDb(uid string, cfg *cfg.GameRdtaskCondiD
return
}
func (this *ModelRtaskRecord) verifyFirstEqualParam(uid string, cfg *cfg.GameRdtaskCondiData) (err error, ok bool) {
var rd *pb.RtaskData
if rd, err = this.GetVerifyData(uid, cfg.Id); rd != nil {
if len(rd.Data) == 0 {
err = errors.WithMessagef(err, "玩家参数数据缺失 %v", rd.Data)
return
}
return nil, soEqual(rd.Data[0], cfg.Data1)
}
return
}
func (this *ModelRtaskRecord) verifyFirstGreatEqualParam(uid string, cfg *cfg.GameRdtaskCondiData) (err error, ok bool) {
var rd *pb.RtaskData
if rd, err = this.GetVerifyData(uid, cfg.Id); rd != nil {
if len(rd.Data) == 0 {
err = errors.WithMessagef(err, "玩家参数数据缺失 %v", rd.Data)
return
}
return nil, soGreatEqual(rd.Data[0], cfg.Data1)
}
return
}
// 英雄指定
func (this *ModelRtask) verfiyRtype1(uid string, cfg *cfg.GameRdtaskCondiData) (err error, ok bool) {
heroModule, err := this.service.GetModule(comm.ModuleHero)
@ -47,13 +74,12 @@ func (this *ModelRtask) verfiyRtype1(uid string, cfg *cfg.GameRdtaskCondiData) (
if h, y := heroModule.(comm.IHero); y {
for _, v := range h.GetHeroList(uid) {
if cast.ToString(cfg.Data1) == v.HeroID {
if soEqual(cast.ToString(cfg.Data1), v.HeroID) {
ok = true
return
}
}
}
return
}
@ -66,7 +92,7 @@ func (this *ModelRtask) verifyRtype2(uid string, cfg *cfg.GameRdtaskCondiData) (
if ml, y := m.(comm.IMainline); y {
qjId := ml.GetUsermainLineData(uid)
return nil, qjId == cfg.Data1
return nil, soEqual(qjId, cfg.Data1)
}
return
}
@ -107,7 +133,7 @@ func (this *ModelRtask) verifyRtype4(uid string, cfg *cfg.GameRdtaskCondiData) (
}
if hero != nil {
return nil, soEqual(hero.HeroID, cast.ToString(cfg.Data1)) &&
soEqual(hero.Lv, cfg.Data2)
soGreatEqual(hero.Lv, cfg.Data2)
}
}
return
@ -139,7 +165,7 @@ func (this *ModelRtask) verifyRtype5(uid string, cfg *cfg.GameRdtaskCondiData) (
}
}
return nil, soEqual(hero.HeroID, cast.ToString(cfg.Data1)) &&
soEqual(count, cfg.Data2)
soGreatEqual(count, cfg.Data2)
}
return
}
@ -163,7 +189,7 @@ func (this *ModelRtask) verifyRtype6(uid string, cfg *cfg.GameRdtaskCondiData) (
if hero != nil {
return nil, soEqual(hero.HeroID, cast.ToString(cfg.Data1)) &&
soEqual(hero.Star, cfg.Data2)
soGreatEqual(hero.Star, cfg.Data2)
}
}
return
@ -198,7 +224,7 @@ func (this *ModelRtask) verfiyRtype8(uid string, cfg *cfg.GameRdtaskCondiData) (
if err != nil {
return err, false
}
return nil, soEqual(ud.LoginAddCount, cfg.Data1)
return nil, soGreatEqual(ud.LoginAddCount, cfg.Data1)
}
return
}
@ -216,7 +242,7 @@ func (this *ModelRtask) verfiyRtype9(uid string, cfg *cfg.GameRdtaskCondiData) (
if err != nil {
return err, false
}
return nil, soEqual(ud.LoginContinueCount, cfg.Data1)
return nil, soGreatEqual(ud.LoginContinueCount, cfg.Data1)
}
return
}
@ -231,7 +257,7 @@ func (this *ModelRtask) verfiyRtype10(uid string, cfg *cfg.GameRdtaskCondiData)
if mi, y := m.(comm.IFriend); y {
count := mi.GetFriendCount(uid)
return nil, soGreatThan(count, cfg.Data1)
return nil, soGreatEqual(count, cfg.Data1)
}
return
}
@ -246,7 +272,7 @@ func (this *ModelRtask) verifyRtype20(uid string, cfg *cfg.GameRdtaskCondiData)
if um, y := userModule.(comm.IUser); y {
if user := um.GetUser(uid); user != nil {
return nil, soEqual(user.Lv, cfg.Data1)
return nil, soGreatEqual(user.Lv, cfg.Data1)
}
}
return
@ -266,9 +292,7 @@ func (this *ModelRtask) verifyRtype63(uid string, cfg *cfg.GameRdtaskCondiData)
}
if de != nil {
if de.Activeday == cfg.Data1 {
ok = true
}
ok = soGreatEqual(de.Activeday, cfg.Data1)
}
}

View File

@ -28,7 +28,7 @@ func TestVerify(t *testing.T) {
patches2 := gomonkey.ApplyGlobalVar(&vals, []int32{25002})
defer patches2.Reset()
n, err := verifyParam(conf, vals...)
n, err := lenParam(conf, vals...)
fmt.Println(n, err)
})