Files
2026-07-25 22:58:38 +08:00

82 lines
2.3 KiB
Go

package option
import (
"reflect"
"github.com/sagernet/sing-box/schema"
E "github.com/sagernet/sing/common/exceptions"
"github.com/sagernet/sing/common/json"
"github.com/sagernet/sing/common/json/badjson"
)
const (
USBIPProviderDefault = "default"
USBIPProviderDynamic = "dynamic"
)
type _USBIPServerServiceOptions struct {
ListenOptions
Provider string `json:"provider,omitempty" enum:"default,dynamic"`
Options any `json:"-"`
}
type USBIPServerServiceOptions _USBIPServerServiceOptions
func (o USBIPServerServiceOptions) MarshalJSON() ([]byte, error) {
if o.Options == nil {
return json.Marshal((_USBIPServerServiceOptions)(o))
}
return badjson.MarshallObjects((_USBIPServerServiceOptions)(o), o.Options)
}
func (o *USBIPServerServiceOptions) UnmarshalJSON(content []byte) error {
err := json.Unmarshal(content, (*_USBIPServerServiceOptions)(o))
if err != nil {
return err
}
var options any
switch o.Provider {
case "", USBIPProviderDefault:
o.Provider = USBIPProviderDefault
options = new(USBIPDefaultProviderOptions)
case USBIPProviderDynamic:
options = new(USBIPDynamicProviderOptions)
default:
return E.New("unknown usbip provider type: ", o.Provider)
}
err = badjson.UnmarshallExcluded(content, (*_USBIPServerServiceOptions)(o), options)
if err != nil {
return err
}
o.Options = options
return nil
}
func (o USBIPServerServiceOptions) DescribeSchema(builder schema.Builder) (*schema.Node, error) {
return schema.DiscriminatedUnion(builder, "provider", false, []schema.UnionVariant{
{Value: USBIPProviderDefault, StructType: reflect.TypeFor[USBIPDefaultProviderOptions](), TypeOptional: true},
{Value: USBIPProviderDynamic, StructType: reflect.TypeFor[USBIPDynamicProviderOptions]()},
}, func(variant *schema.Node) error {
return builder.FlattenStruct(variant, reflect.TypeFor[ListenOptions]())
})
}
type USBIPClientServiceOptions struct {
DialerOptions
ServerOptions
Devices []USBIPDeviceMatch `json:"devices,omitempty"`
}
type USBIPDeviceMatch struct {
BusID string `json:"bus_id,omitempty"`
VendorID uint16 `json:"vendor_id,omitempty"`
ProductID uint16 `json:"product_id,omitempty"`
Serial string `json:"serial,omitempty"`
}
type USBIPDefaultProviderOptions struct {
Devices []USBIPDeviceMatch `json:"devices,omitempty"`
}
type USBIPDynamicProviderOptions struct{}