| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 | 
							- package option
 
- import (
 
- 	E "github.com/sagernet/sing/common/exceptions"
 
- 	"github.com/sagernet/sing/common/json"
 
- 	"github.com/sagernet/sing/common/json/badoption"
 
- )
 
- type OnDemandOptions struct {
 
- 	Enabled bool           `json:"enabled,omitempty"`
 
- 	Rules   []OnDemandRule `json:"rules,omitempty"`
 
- }
 
- type OnDemandRule struct {
 
- 	Action                *OnDemandRuleAction        `json:"action,omitempty"`
 
- 	DNSSearchDomainMatch  badoption.Listable[string] `json:"dns_search_domain_match,omitempty"`
 
- 	DNSServerAddressMatch badoption.Listable[string] `json:"dns_server_address_match,omitempty"`
 
- 	InterfaceTypeMatch    *OnDemandRuleInterfaceType `json:"interface_type_match,omitempty"`
 
- 	SSIDMatch             badoption.Listable[string] `json:"ssid_match,omitempty"`
 
- 	ProbeURL              string                     `json:"probe_url,omitempty"`
 
- }
 
- type OnDemandRuleAction int
 
- func (r *OnDemandRuleAction) MarshalJSON() ([]byte, error) {
 
- 	if r == nil {
 
- 		return nil, nil
 
- 	}
 
- 	value := *r
 
- 	var actionName string
 
- 	switch value {
 
- 	case 1:
 
- 		actionName = "connect"
 
- 	case 2:
 
- 		actionName = "disconnect"
 
- 	case 3:
 
- 		actionName = "evaluate_connection"
 
- 	default:
 
- 		return nil, E.New("unknown action: ", value)
 
- 	}
 
- 	return json.Marshal(actionName)
 
- }
 
- func (r *OnDemandRuleAction) UnmarshalJSON(bytes []byte) error {
 
- 	var actionName string
 
- 	if err := json.Unmarshal(bytes, &actionName); err != nil {
 
- 		return err
 
- 	}
 
- 	var actionValue int
 
- 	switch actionName {
 
- 	case "connect":
 
- 		actionValue = 1
 
- 	case "disconnect":
 
- 		actionValue = 2
 
- 	case "evaluate_connection":
 
- 		actionValue = 3
 
- 	case "ignore":
 
- 		actionValue = 4
 
- 	default:
 
- 		return E.New("unknown action name: ", actionName)
 
- 	}
 
- 	*r = OnDemandRuleAction(actionValue)
 
- 	return nil
 
- }
 
- type OnDemandRuleInterfaceType int
 
- func (r *OnDemandRuleInterfaceType) MarshalJSON() ([]byte, error) {
 
- 	if r == nil {
 
- 		return nil, nil
 
- 	}
 
- 	value := *r
 
- 	var interfaceTypeName string
 
- 	switch value {
 
- 	case 1:
 
- 		interfaceTypeName = "any"
 
- 	case 2:
 
- 		interfaceTypeName = "wifi"
 
- 	case 3:
 
- 		interfaceTypeName = "cellular"
 
- 	default:
 
- 		return nil, E.New("unknown interface type: ", value)
 
- 	}
 
- 	return json.Marshal(interfaceTypeName)
 
- }
 
- func (r *OnDemandRuleInterfaceType) UnmarshalJSON(bytes []byte) error {
 
- 	var interfaceTypeName string
 
- 	if err := json.Unmarshal(bytes, &interfaceTypeName); err != nil {
 
- 		return err
 
- 	}
 
- 	var interfaceTypeValue int
 
- 	switch interfaceTypeName {
 
- 	case "any":
 
- 		interfaceTypeValue = 1
 
- 	case "wifi":
 
- 		interfaceTypeValue = 2
 
- 	case "cellular":
 
- 		interfaceTypeValue = 3
 
- 	default:
 
- 		return E.New("unknown interface type name: ", interfaceTypeName)
 
- 	}
 
- 	*r = OnDemandRuleInterfaceType(interfaceTypeValue)
 
- 	return nil
 
- }
 
 
  |