Refactor errors

This commit is contained in:
Unrud 2023-04-25 01:38:48 +02:00
parent 91a37de0fb
commit 891fde7051
5 changed files with 43 additions and 35 deletions

View file

@ -70,11 +70,15 @@ func RegisterController(name string, init func() (Controller, error), priority i
} }
type UnsupportedPlatformError struct { type UnsupportedPlatformError struct {
err error Err error
} }
func (e UnsupportedPlatformError) Error() string { func (e *UnsupportedPlatformError) Error() string {
return e.err.Error() return e.Err.Error()
}
func (e *UnsupportedPlatformError) Unwrap() error {
return e.Err
} }
type Controller interface { type Controller interface {

View file

@ -55,7 +55,7 @@ func init() {
func InitPortalController() (Controller, error) { func InitPortalController() (Controller, error) {
bus, err := dbus.SessionBusPrivate() bus, err := dbus.SessionBusPrivate()
if err != nil { if err != nil {
return nil, UnsupportedPlatformError{err} return nil, &UnsupportedPlatformError{err}
} }
cleanupBus := true cleanupBus := true
defer func() { defer func() {
@ -65,49 +65,49 @@ func InitPortalController() (Controller, error) {
}() }()
err = bus.Auth(nil) err = bus.Auth(nil)
if err != nil { if err != nil {
return nil, UnsupportedPlatformError{err} return nil, &UnsupportedPlatformError{err}
} }
err = bus.Hello() err = bus.Hello()
if err != nil { if err != nil {
return nil, UnsupportedPlatformError{err} return nil, &UnsupportedPlatformError{err}
} }
remoteDesktop := bus.Object("org.freedesktop.portal.Desktop", remoteDesktop := bus.Object("org.freedesktop.portal.Desktop",
"/org/freedesktop/portal/desktop") "/org/freedesktop/portal/desktop")
availableDeviceTypesV, err := remoteDesktop.GetProperty( availableDeviceTypesV, err := remoteDesktop.GetProperty(
"org.freedesktop.portal.RemoteDesktop.AvailableDeviceTypes") "org.freedesktop.portal.RemoteDesktop.AvailableDeviceTypes")
if err != nil { if err != nil {
return nil, UnsupportedPlatformError{err} return nil, &UnsupportedPlatformError{err}
} }
availableDeviceTypes, ok := availableDeviceTypesV.Value().(uint32) availableDeviceTypes, ok := availableDeviceTypesV.Value().(uint32)
if !ok { if !ok {
return nil, UnsupportedPlatformError{errors.New( return nil, &UnsupportedPlatformError{
"unexpected 'AvailableDeviceTypes' return type")} errors.New("unexpected 'AvailableDeviceTypes' return type")}
} }
if availableDeviceTypes&deviceKeyboard == 0 || if availableDeviceTypes&deviceKeyboard == 0 ||
availableDeviceTypes&devicePointer == 0 { availableDeviceTypes&devicePointer == 0 {
return nil, UnsupportedPlatformError{errors.New( return nil, &UnsupportedPlatformError{
"keyboard or pointer source type not supported")} errors.New("keyboard or pointer source type not supported")}
} }
inVardict := make(map[string]dbus.Variant) inVardict := make(map[string]dbus.Variant)
inVardict["session_handle_token"] = dbus.MakeVariant("t") inVardict["session_handle_token"] = dbus.MakeVariant("t")
result, outVardict, err := getResponse(bus, remoteDesktop, result, outVardict, err := getResponse(bus, remoteDesktop,
"org.freedesktop.portal.RemoteDesktop.CreateSession", 0, inVardict) "org.freedesktop.portal.RemoteDesktop.CreateSession", 0, inVardict)
if err != nil { if err != nil {
return nil, UnsupportedPlatformError{err} return nil, &UnsupportedPlatformError{err}
} }
if result != 0 { if result != 0 {
return nil, UnsupportedPlatformError{errors.New(fmt.Sprintf( return nil, &UnsupportedPlatformError{
"Calling 'CreateSession' failed (%v)", result))} fmt.Errorf("Calling 'CreateSession' failed (%v)", result)}
} }
sessionHandleV, ok := outVardict["session_handle"] sessionHandleV, ok := outVardict["session_handle"]
if !ok { if !ok {
return nil, UnsupportedPlatformError{errors.New( return nil, &UnsupportedPlatformError{
"'session_handle' missing from 'CreateSession' return value")} errors.New("'session_handle' missing from 'CreateSession' return value")}
} }
sessionHandleS, ok := sessionHandleV.Value().(string) sessionHandleS, ok := sessionHandleV.Value().(string)
if !ok { if !ok {
return nil, UnsupportedPlatformError{errors.New( return nil, &UnsupportedPlatformError{
"unexpected 'session_handle' type in 'CreateSession' return value")} errors.New("unexpected 'session_handle' type in 'CreateSession' return value")}
} }
sessionHandle := dbus.ObjectPath(sessionHandleS) sessionHandle := dbus.ObjectPath(sessionHandleS)
inVardict = make(map[string]dbus.Variant) inVardict = make(map[string]dbus.Variant)
@ -115,30 +115,30 @@ func InitPortalController() (Controller, error) {
result, outVardict, err = getResponse(bus, remoteDesktop, result, outVardict, err = getResponse(bus, remoteDesktop,
"org.freedesktop.portal.RemoteDesktop.SelectDevices", 0, sessionHandle, inVardict) "org.freedesktop.portal.RemoteDesktop.SelectDevices", 0, sessionHandle, inVardict)
if err != nil { if err != nil {
return nil, UnsupportedPlatformError{err} return nil, &UnsupportedPlatformError{err}
} }
if result != 0 { if result != 0 {
return nil, UnsupportedPlatformError{errors.New(fmt.Sprintf( return nil, &UnsupportedPlatformError{
"Calling 'SelectDevices' failed (%v)", result))} fmt.Errorf("Calling 'SelectDevices' failed (%v)", result)}
} }
inVardict = make(map[string]dbus.Variant) inVardict = make(map[string]dbus.Variant)
result, outVardict, err = getResponse(bus, remoteDesktop, result, outVardict, err = getResponse(bus, remoteDesktop,
"org.freedesktop.portal.RemoteDesktop.Start", 0, sessionHandle, "", inVardict) "org.freedesktop.portal.RemoteDesktop.Start", 0, sessionHandle, "", inVardict)
if err != nil { if err != nil {
return nil, UnsupportedPlatformError{err} return nil, &UnsupportedPlatformError{err}
} }
if result != 0 { if result != 0 {
return nil, errors.New("keyboard or pointer access denied") return nil, errors.New("keyboard or pointer access denied")
} }
devicesV, ok := outVardict["devices"] devicesV, ok := outVardict["devices"]
if !ok { if !ok {
return nil, UnsupportedPlatformError{errors.New( return nil, &UnsupportedPlatformError{
"'devices' missing from 'Start' return value")} errors.New("'devices' missing from 'Start' return value")}
} }
devices, ok := devicesV.Value().(uint32) devices, ok := devicesV.Value().(uint32)
if !ok { if !ok {
return nil, UnsupportedPlatformError{errors.New( return nil, &UnsupportedPlatformError{
"unexpected 'devices' type in 'Start' return value")} errors.New("unexpected 'devices' type in 'Start' return value")}
} }
if devices&deviceKeyboard == 0 || devices&devicePointer == 0 { if devices&deviceKeyboard == 0 || devices&devicePointer == 0 {
return nil, errors.New("keyboard or pointer access denied") return nil, errors.New("keyboard or pointer access denied")

View file

@ -98,7 +98,7 @@ func init() {
func InitWindowsController() (Controller, error) { func InitWindowsController() (Controller, error) {
p := &windowsController{} p := &windowsController{}
if err := sendInputProc.Find(); err != nil { if err := sendInputProc.Find(); err != nil {
return nil, UnsupportedPlatformError{err} return nil, &UnsupportedPlatformError{err}
} }
return p, nil return p, nil
} }

View file

@ -61,13 +61,13 @@ func init() {
func InitX11Controller() (Controller, error) { func InitX11Controller() (Controller, error) {
display := C.XOpenDisplay(nil) display := C.XOpenDisplay(nil)
if display == nil { if display == nil {
return nil, UnsupportedPlatformError{ return nil, &UnsupportedPlatformError{
errors.New("failed to connect to X server")} errors.New("failed to connect to X server")}
} }
p := &x11Controller{display: display} p := &x11Controller{display: display}
if p.xIsXwayland() { if p.xIsXwayland() {
p.Close() p.Close()
return nil, UnsupportedPlatformError{ return nil, &UnsupportedPlatformError{
errors.New("X server is Xwayland")} errors.New("X server is Xwayland")}
} }
return p, nil return p, nil

16
main.go
View file

@ -184,21 +184,25 @@ func main() {
} }
var controller inputcontrol.Controller var controller inputcontrol.Controller
var controllerName string var controllerName string
platformErrors := "" var platformErrs []error
for _, controllerInfo := range inputcontrol.Controllers { for _, controllerInfo := range inputcontrol.Controllers {
controllerName = controllerInfo.Name controllerName = controllerInfo.Name
var err error var err error
controller, err = controllerInfo.Init() controller, err = controllerInfo.Init()
if err == nil { if err == nil {
break break
} else if _, ok := err.(inputcontrol.UnsupportedPlatformError); ok {
platformErrors += fmt.Sprintf("%s controller: %v\n", controllerName, err)
} else { } 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 { if controller == nil {
log.Fatal("unsupported platform:\n" + platformErrors) log.Fatal(fmt.Errorf("unsupported platform:\n%w", errors.Join(platformErrs...)))
} }
defer controller.Close() defer controller.Close()
authenticationChallenges := make(chan challenge, authenticationRateBurst) authenticationChallenges := make(chan challenge, authenticationRateBurst)
@ -241,7 +245,7 @@ func main() {
return return
} }
if err := processCommand(controller, message); err != nil { if err := processCommand(controller, message); err != nil {
log.Printf("%s controller: %v", controllerName, err) log.Print(fmt.Errorf("%s controller: %w", controllerName, err))
return return
} }
} }