Refactor errors
This commit is contained in:
parent
91a37de0fb
commit
891fde7051
5 changed files with 43 additions and 35 deletions
|
|
@ -70,11 +70,15 @@ func RegisterController(name string, init func() (Controller, error), priority i
|
|||
}
|
||||
|
||||
type UnsupportedPlatformError struct {
|
||||
err error
|
||||
Err error
|
||||
}
|
||||
|
||||
func (e UnsupportedPlatformError) Error() string {
|
||||
return e.err.Error()
|
||||
func (e *UnsupportedPlatformError) Error() string {
|
||||
return e.Err.Error()
|
||||
}
|
||||
|
||||
func (e *UnsupportedPlatformError) Unwrap() error {
|
||||
return e.Err
|
||||
}
|
||||
|
||||
type Controller interface {
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ func init() {
|
|||
func InitPortalController() (Controller, error) {
|
||||
bus, err := dbus.SessionBusPrivate()
|
||||
if err != nil {
|
||||
return nil, UnsupportedPlatformError{err}
|
||||
return nil, &UnsupportedPlatformError{err}
|
||||
}
|
||||
cleanupBus := true
|
||||
defer func() {
|
||||
|
|
@ -65,49 +65,49 @@ func InitPortalController() (Controller, error) {
|
|||
}()
|
||||
err = bus.Auth(nil)
|
||||
if err != nil {
|
||||
return nil, UnsupportedPlatformError{err}
|
||||
return nil, &UnsupportedPlatformError{err}
|
||||
}
|
||||
err = bus.Hello()
|
||||
if err != nil {
|
||||
return nil, UnsupportedPlatformError{err}
|
||||
return nil, &UnsupportedPlatformError{err}
|
||||
}
|
||||
remoteDesktop := bus.Object("org.freedesktop.portal.Desktop",
|
||||
"/org/freedesktop/portal/desktop")
|
||||
availableDeviceTypesV, err := remoteDesktop.GetProperty(
|
||||
"org.freedesktop.portal.RemoteDesktop.AvailableDeviceTypes")
|
||||
if err != nil {
|
||||
return nil, UnsupportedPlatformError{err}
|
||||
return nil, &UnsupportedPlatformError{err}
|
||||
}
|
||||
availableDeviceTypes, ok := availableDeviceTypesV.Value().(uint32)
|
||||
if !ok {
|
||||
return nil, UnsupportedPlatformError{errors.New(
|
||||
"unexpected 'AvailableDeviceTypes' return type")}
|
||||
return nil, &UnsupportedPlatformError{
|
||||
errors.New("unexpected 'AvailableDeviceTypes' return type")}
|
||||
}
|
||||
if availableDeviceTypes&deviceKeyboard == 0 ||
|
||||
availableDeviceTypes&devicePointer == 0 {
|
||||
return nil, UnsupportedPlatformError{errors.New(
|
||||
"keyboard or pointer source type not supported")}
|
||||
return nil, &UnsupportedPlatformError{
|
||||
errors.New("keyboard or pointer source type not supported")}
|
||||
}
|
||||
inVardict := make(map[string]dbus.Variant)
|
||||
inVardict["session_handle_token"] = dbus.MakeVariant("t")
|
||||
result, outVardict, err := getResponse(bus, remoteDesktop,
|
||||
"org.freedesktop.portal.RemoteDesktop.CreateSession", 0, inVardict)
|
||||
if err != nil {
|
||||
return nil, UnsupportedPlatformError{err}
|
||||
return nil, &UnsupportedPlatformError{err}
|
||||
}
|
||||
if result != 0 {
|
||||
return nil, UnsupportedPlatformError{errors.New(fmt.Sprintf(
|
||||
"Calling 'CreateSession' failed (%v)", result))}
|
||||
return nil, &UnsupportedPlatformError{
|
||||
fmt.Errorf("Calling 'CreateSession' failed (%v)", result)}
|
||||
}
|
||||
sessionHandleV, ok := outVardict["session_handle"]
|
||||
if !ok {
|
||||
return nil, UnsupportedPlatformError{errors.New(
|
||||
"'session_handle' missing from 'CreateSession' return value")}
|
||||
return nil, &UnsupportedPlatformError{
|
||||
errors.New("'session_handle' missing from 'CreateSession' return value")}
|
||||
}
|
||||
sessionHandleS, ok := sessionHandleV.Value().(string)
|
||||
if !ok {
|
||||
return nil, UnsupportedPlatformError{errors.New(
|
||||
"unexpected 'session_handle' type in 'CreateSession' return value")}
|
||||
return nil, &UnsupportedPlatformError{
|
||||
errors.New("unexpected 'session_handle' type in 'CreateSession' return value")}
|
||||
}
|
||||
sessionHandle := dbus.ObjectPath(sessionHandleS)
|
||||
inVardict = make(map[string]dbus.Variant)
|
||||
|
|
@ -115,30 +115,30 @@ func InitPortalController() (Controller, error) {
|
|||
result, outVardict, err = getResponse(bus, remoteDesktop,
|
||||
"org.freedesktop.portal.RemoteDesktop.SelectDevices", 0, sessionHandle, inVardict)
|
||||
if err != nil {
|
||||
return nil, UnsupportedPlatformError{err}
|
||||
return nil, &UnsupportedPlatformError{err}
|
||||
}
|
||||
if result != 0 {
|
||||
return nil, UnsupportedPlatformError{errors.New(fmt.Sprintf(
|
||||
"Calling 'SelectDevices' failed (%v)", result))}
|
||||
return nil, &UnsupportedPlatformError{
|
||||
fmt.Errorf("Calling 'SelectDevices' failed (%v)", result)}
|
||||
}
|
||||
inVardict = make(map[string]dbus.Variant)
|
||||
result, outVardict, err = getResponse(bus, remoteDesktop,
|
||||
"org.freedesktop.portal.RemoteDesktop.Start", 0, sessionHandle, "", inVardict)
|
||||
if err != nil {
|
||||
return nil, UnsupportedPlatformError{err}
|
||||
return nil, &UnsupportedPlatformError{err}
|
||||
}
|
||||
if result != 0 {
|
||||
return nil, errors.New("keyboard or pointer access denied")
|
||||
}
|
||||
devicesV, ok := outVardict["devices"]
|
||||
if !ok {
|
||||
return nil, UnsupportedPlatformError{errors.New(
|
||||
"'devices' missing from 'Start' return value")}
|
||||
return nil, &UnsupportedPlatformError{
|
||||
errors.New("'devices' missing from 'Start' return value")}
|
||||
}
|
||||
devices, ok := devicesV.Value().(uint32)
|
||||
if !ok {
|
||||
return nil, UnsupportedPlatformError{errors.New(
|
||||
"unexpected 'devices' type in 'Start' return value")}
|
||||
return nil, &UnsupportedPlatformError{
|
||||
errors.New("unexpected 'devices' type in 'Start' return value")}
|
||||
}
|
||||
if devices&deviceKeyboard == 0 || devices&devicePointer == 0 {
|
||||
return nil, errors.New("keyboard or pointer access denied")
|
||||
|
|
|
|||
|
|
@ -98,7 +98,7 @@ func init() {
|
|||
func InitWindowsController() (Controller, error) {
|
||||
p := &windowsController{}
|
||||
if err := sendInputProc.Find(); err != nil {
|
||||
return nil, UnsupportedPlatformError{err}
|
||||
return nil, &UnsupportedPlatformError{err}
|
||||
}
|
||||
return p, nil
|
||||
}
|
||||
|
|
|
|||
|
|
@ -61,13 +61,13 @@ func init() {
|
|||
func InitX11Controller() (Controller, error) {
|
||||
display := C.XOpenDisplay(nil)
|
||||
if display == nil {
|
||||
return nil, UnsupportedPlatformError{
|
||||
return nil, &UnsupportedPlatformError{
|
||||
errors.New("failed to connect to X server")}
|
||||
}
|
||||
p := &x11Controller{display: display}
|
||||
if p.xIsXwayland() {
|
||||
p.Close()
|
||||
return nil, UnsupportedPlatformError{
|
||||
return nil, &UnsupportedPlatformError{
|
||||
errors.New("X server is Xwayland")}
|
||||
}
|
||||
return p, nil
|
||||
|
|
|
|||
16
main.go
16
main.go
|
|
@ -184,21 +184,25 @@ func main() {
|
|||
}
|
||||
var controller inputcontrol.Controller
|
||||
var controllerName string
|
||||
platformErrors := ""
|
||||
var platformErrs []error
|
||||
for _, controllerInfo := range inputcontrol.Controllers {
|
||||
controllerName = controllerInfo.Name
|
||||
var err error
|
||||
controller, err = controllerInfo.Init()
|
||||
if err == nil {
|
||||
break
|
||||
} else if _, ok := err.(inputcontrol.UnsupportedPlatformError); ok {
|
||||
platformErrors += fmt.Sprintf("%s controller: %v\n", controllerName, err)
|
||||
} else {
|
||||
log.Fatalf("%s controller: %v", controllerName, err)
|
||||
var unsupportedErr *inputcontrol.UnsupportedPlatformError
|
||||
wrappedErr := fmt.Errorf("%v controller: %w", controllerName, err)
|
||||
if errors.As(err, &unsupportedErr) {
|
||||
platformErrs = append(platformErrs, wrappedErr)
|
||||
} else {
|
||||
log.Fatal(wrappedErr)
|
||||
}
|
||||
}
|
||||
}
|
||||
if controller == nil {
|
||||
log.Fatal("unsupported platform:\n" + platformErrors)
|
||||
log.Fatal(fmt.Errorf("unsupported platform:\n%w", errors.Join(platformErrs...)))
|
||||
}
|
||||
defer controller.Close()
|
||||
authenticationChallenges := make(chan challenge, authenticationRateBurst)
|
||||
|
|
@ -241,7 +245,7 @@ func main() {
|
|||
return
|
||||
}
|
||||
if err := processCommand(controller, message); err != nil {
|
||||
log.Printf("%s controller: %v", controllerName, err)
|
||||
log.Print(fmt.Errorf("%s controller: %w", controllerName, err))
|
||||
return
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue