package crontab import ( "strconv" "strings" "474420502.top/eson/structure/priority_list" randomdata "github.com/Pallinder/go-randomdata" ) type randLR struct { left, right int } // NodeCount 用于priority_list type NodeCount struct { plist.Node randLR } // Compare NodeCount比较函数 func (rlr *NodeCount) Compare(v plist.INode) bool { return rlr.GetValue().(int) > v.GetValue().(int) } func parseRandLR(lrvalue string) randLR { vlen := len(lrvalue) lastchar := lrvalue[vlen-1] lr := strings.Split(lrvalue, "-") switch len(lr) { case 1: lr := randLR{parseTimeValue(lr[0], lastchar), parseTimeValue(lr[0], lastchar)} return lr case 2: lr := randLR{parseTimeValue(lr[0], lastchar), parseTimeValue(lr[1], lastchar)} return lr default: panic("lr is error") } } // intervalPriorityListISecond 获取优先链表比较的值 func intervalPriorityListISecond(planlist *plist.PriorityList, count int) int { if planlist.Size() > 0 { node := new(NodeCount) node.SetValue(count) iwantNode := planlist.GetCompare(node) if iwantNode != nil { wantNode := iwantNode.(*NodeCount) lr := wantNode.randLR return randomdata.Number(lr.left, lr.right+1) } } return -1 } func getInt(v string) int { vint, err := strconv.Atoi(v) if err != nil { panic(err) } return vint } func parseTimeValue(v string, lastchar byte) int { vlen := len(v) switch lastchar { case 's': return getInt(v[:vlen-1]) case 'm': return getInt(v[:vlen-1]) * 60 case 'h': return getInt(v[:vlen-1]) * 3600 case 'd': return getInt(v[:vlen-1]) * 3600 * 24 default: return getInt(v) } }