package badoption import ( "encoding/json" "fmt" "strconv" "strings" "github.com/sagernet/sing-box/common/xray/crypto" E "github.com/sagernet/sing/common/exceptions" ) type Range struct { From int32 `json:"from"` To int32 `json:"to"` } func (c *Range) Build() *Range { return (*Range)(c) } func (c *Range) MarshalJSON() ([]byte, error) { return json.Marshal(fmt.Sprintf("%d-%d", c.From, c.To)) } func (c *Range) UnmarshalJSON(content []byte) error { var stringValue string err := json.Unmarshal(content, &stringValue) if err != nil { return err } parts := strings.Split(stringValue, "-") if len(parts) != 2 { return E.New("invalid length of range parts") } from, err := strconv.ParseInt(parts[0], 10, 32) if err != nil { return err } to, err := strconv.ParseInt(parts[1], 10, 32) if err != nil { return err } if from > to { return E.New("invalid range") } *c = Range{int32(from), int32(to)} return nil } func (c Range) Rand() int32 { return int32(crypto.RandBetween(int64(c.From), int64(c.To))) }