mirror of
https://codeberg.org/cunicu/cunicu.git
synced 2025-10-05 16:57:01 +08:00
181 lines
2.9 KiB
Go
181 lines
2.9 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"net/url"
|
|
"regexp"
|
|
"strings"
|
|
|
|
"github.com/pion/ice/v2"
|
|
"go.uber.org/zap"
|
|
"riasc.eu/wice/pkg/proxy"
|
|
)
|
|
|
|
type backendURLList []*url.URL
|
|
|
|
func (i *backendURLList) Type() string {
|
|
return "stringSlice"
|
|
}
|
|
|
|
func (i *backendURLList) String() string {
|
|
s := []string{}
|
|
for _, u := range *i {
|
|
s = append(s, u.String())
|
|
}
|
|
|
|
return strings.Join(s, ",")
|
|
}
|
|
|
|
func (i *backendURLList) Set(value string) error {
|
|
|
|
// Allow the user to specify just the backend type as a valid url.
|
|
// E.g. "p2p" instead of "p2p:"
|
|
if !strings.Contains(value, ":") {
|
|
value += ":"
|
|
}
|
|
|
|
uri, err := url.Parse(value)
|
|
if err != nil {
|
|
return fmt.Errorf("invalid backend URI: %w", err)
|
|
}
|
|
|
|
*i = append(*i, uri)
|
|
|
|
return nil
|
|
}
|
|
|
|
type arrayFlags []string
|
|
|
|
func (i *arrayFlags) String() string {
|
|
return strings.Join(*i, ",")
|
|
}
|
|
|
|
func (i *arrayFlags) Set(value string) error {
|
|
*i = append(*i, value)
|
|
return nil
|
|
}
|
|
|
|
func (i *arrayFlags) Type() string {
|
|
return "stringSlice"
|
|
}
|
|
|
|
type iceURLList []*ice.URL
|
|
|
|
func (ul *iceURLList) Type() string {
|
|
return "stringSlice"
|
|
}
|
|
|
|
func (ul *iceURLList) Set(value string) error {
|
|
u, err := ice.ParseURL(value)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
*ul = append(*ul, u)
|
|
|
|
return nil
|
|
}
|
|
|
|
func (ul *iceURLList) String() string {
|
|
l := []string{}
|
|
|
|
for _, u := range *ul {
|
|
l = append(l, u.String())
|
|
}
|
|
|
|
return strings.Join(l, ",")
|
|
}
|
|
|
|
type candidateTypeList []ice.CandidateType
|
|
|
|
func (cl *candidateTypeList) Type() string {
|
|
return "stringSlice"
|
|
}
|
|
|
|
func (cl *candidateTypeList) Set(value string) error {
|
|
ct, err := candidateTypeFromString(value)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
*cl = append(*cl, ct)
|
|
|
|
return nil
|
|
}
|
|
|
|
func (cl *candidateTypeList) String() string {
|
|
l := []string{}
|
|
|
|
for _, c := range *cl {
|
|
l = append(l, c.String())
|
|
}
|
|
|
|
return strings.Join(l, ",")
|
|
}
|
|
|
|
type networkTypeList []ice.NetworkType
|
|
|
|
func (nl *networkTypeList) Type() string {
|
|
return "stringSlice"
|
|
}
|
|
|
|
func (nl *networkTypeList) Set(value string) error {
|
|
ct, err := networkTypeFromString(value)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
*nl = append(*nl, ct)
|
|
|
|
return nil
|
|
}
|
|
|
|
func (nl *networkTypeList) String() string {
|
|
l := []string{}
|
|
|
|
for _, c := range *nl {
|
|
l = append(l, c.String())
|
|
}
|
|
|
|
return strings.Join(l, ",")
|
|
}
|
|
|
|
type proxyType struct{ proxy.ProxyType }
|
|
|
|
func (pt *proxyType) Type() string {
|
|
return "string"
|
|
}
|
|
|
|
func (pt *proxyType) Set(value string) error {
|
|
var err error
|
|
pt.ProxyType, err = proxy.ProxyTypeFromString(value)
|
|
return err
|
|
}
|
|
|
|
type logLevel struct{ zap.AtomicLevel }
|
|
|
|
func (ll *logLevel) Type() string {
|
|
return "string"
|
|
}
|
|
|
|
func (ll *logLevel) Set(value string) error {
|
|
return ll.UnmarshalText([]byte(value))
|
|
}
|
|
|
|
type regex struct{ *regexp.Regexp }
|
|
|
|
func (re *regex) Type() string {
|
|
return "string"
|
|
}
|
|
|
|
func (re *regex) Set(value string) error {
|
|
r, err := regexp.Compile(value)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to compile regex: %w", err)
|
|
}
|
|
|
|
re.Regexp = r
|
|
|
|
return nil
|
|
}
|