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 {
|
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 {
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
16
main.go
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue