mirror of
https://github.com/shtorm-7/sing-box-extended.git
synced 2026-05-25 21:51:47 +03:00
54 lines
1.0 KiB
Go
54 lines
1.0 KiB
Go
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)))
|
|
}
|