bb/lib/common.go

142 lines
2.1 KiB
Go
Raw Normal View History

2022-08-23 18:25:44 +00:00
package lib
2022-08-24 14:06:00 +00:00
import (
"net/url"
"path"
"strconv"
"strings"
)
2022-08-23 18:25:44 +00:00
func Contains[T comparable](s []T, v T) bool {
for _, x := range s {
if x == v {
return true
}
}
return false
}
2022-08-24 14:06:00 +00:00
func JoinInt(a []int, sep string) string {
var b []string
b = make([]string, len(a))
for i, v := range a {
b[i] = strconv.Itoa(v)
}
return strings.Join(b, sep)
}
func SumInt(a []int) int {
var sum int
for _, v := range a {
sum += v
}
return sum
}
func Itob(v int) bool {
if v == 1 {
return true
}
return false
}
func BuildURI(rawuri, rawpath string) string {
u, _ := url.Parse(rawuri)
u.Path = path.Join(u.Path, rawpath)
return u.String()
}
2022-09-05 18:03:02 +00:00
func HasCommand(s, prefix string) bool {
s = strings.TrimSpace(s)
if len(s) == 0 || len(prefix) == 0 {
return false
}
if !strings.HasPrefix(s, prefix) {
return false
}
// remove the command prefix
s = s[len(prefix):]
// multiple assignment trick
cmd, _ := func() (string, string) {
x := strings.SplitN(s, " ", 2)
if len(x) > 1 {
return x[0], x[1]
}
return x[0], ""
}()
return len(cmd) > 0
}
2022-09-05 17:54:56 +00:00
func ContainsCommand(s, prefix, cmd string) bool {
2022-09-01 14:25:59 +00:00
s = strings.TrimSpace(s)
args := strings.Split(s, " ")
s = args[0]
2022-09-01 14:25:59 +00:00
// a command cannot be less than two characters e.g. !x
2022-08-24 14:06:00 +00:00
if len(s) < 2 {
return false
}
if string(s[0]) != prefix {
return false
}
if strings.HasPrefix(s[1:], cmd) {
2022-08-24 14:06:00 +00:00
return true
}
return false
}
func SplitCommandAndArg(s, prefix string) (cmd string, arg string) {
s = strings.TrimSpace(s)
2022-09-05 18:03:47 +00:00
if !strings.HasPrefix(s, prefix) {
return
}
// remove the command prefix
s = s[len(prefix):]
// multiple assignment trick
cmd, arg = func() (string, string) {
x := strings.SplitN(s, " ", 2)
if len(x) > 1 {
return x[0], x[1]
}
return x[0], ""
}()
return cmd, arg
}
func SplitCommandAndArgs(s, prefix string, n int) (cmd string, args []string) {
cmd, arg := SplitCommandAndArg(s, prefix)
if n == 0 {
return cmd, strings.Split(arg, " ")
}
return cmd, strings.SplitN(arg, " ", n)
}
func SplitArgs(s string, n int) (args []string) {
if n > 0 {
args = strings.SplitN(s, " ", n)
} else {
args = strings.Split(s, " ")
}
return
}