gnome-shell/js/misc/dbusErrors.js
Florian Müllner ca0ee2ae90 dbusErrors: Add utility module for handling remote errors
We sometimes return custom D-Bus errors. Right now those errors
are ad-hoc, which means receivers don't have a proper way of
checking whether a thrown GLib.Error corresponds to a particular
remote error.

In order to change that, we should define proper error enums and
domains, and register them with GDBus, so that there is an automatic
mapping between D-Bus errors and GLib.Errors.

The new module doesn't export any domains or enums yet, but provides
internal tooling to make these exports more convenient.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3159>
2024-01-31 20:58:31 +01:00

30 lines
821 B
JavaScript

/* eslint-disable no-unused-vars */
import GLib from 'gi://GLib';
import Gio from 'gi://Gio';
function decamelcase(str, sep) {
return str.replace(/(.)([A-Z])/g, `$1${sep}$2`);
}
function registerErrorDomain(domain, errorNames, prefix = 'org.gnome.Shell') {
const domainName =
`shell-${decamelcase(domain, '-').toLowerCase()}-error`;
const quark = GLib.quark_from_string(domainName);
for (const [code, name] of errorNames.entries()) {
Gio.dbus_error_register_error(quark,
code, `${prefix}.${domain}.Error.${name}`);
}
return quark;
}
function createErrorEnum(errorNames) {
const obj = {};
for (const [code, name] of errorNames.entries()) {
const propName = decamelcase(name, '_').toUpperCase();
obj[propName] = code;
}
return obj;
}