diff --git a/Cargo.toml b/Cargo.toml index cf20d75..cd34518 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ resolver = "2" # Члены растут по планам реализации. crates/core, crates/apps, crates/tools — # группировка привилегированного ядра / first-party-апов / dev-инструментов (architecture §3). -members = ["crates/shturman-common"] +members = ["crates/shturman-common", "crates/shturman-ipc"] [workspace.package] edition = "2021" diff --git a/crates/shturman-ipc/Cargo.toml b/crates/shturman-ipc/Cargo.toml new file mode 100644 index 0000000..5c37968 --- /dev/null +++ b/crates/shturman-ipc/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "shturman-ipc" +version = "0.0.0" +edition.workspace = true +license.workspace = true + +[dependencies] +zbus.workspace = true diff --git a/crates/shturman-ipc/src/error.rs b/crates/shturman-ipc/src/error.rs new file mode 100644 index 0000000..87d136b --- /dev/null +++ b/crates/shturman-ipc/src/error.rs @@ -0,0 +1,20 @@ +//! Контракт ошибок шины — `ru.shturman.Error.*` (ipc §2). + +/// D-Bus-ошибки Штурмана. Маппинг в `ru.shturman.Error.` — через `zbus::DBusError`. +/// В v0 реально используется `InvalidArgument` (Settings); остальные — зарезервированы по мере сервисов. +#[derive(Debug, zbus::DBusError)] +#[zbus(prefix = "ru.shturman.Error")] +pub enum Error { + /// Транспортные ошибки zbus (catch-all). + #[zbus(error)] + ZBus(zbus::Error), + PermissionDenied(String), + /// PID/сигнал не поддержан машиной (постоянно). + NotAvailable(String), + /// Транзиентно: устарело / двигатель заглушен / таймаут. + Stale(String), + Timeout(String), + ReadOnly(String), + InvalidArgument(String), + Unsupported(String), +} diff --git a/crates/shturman-ipc/src/lib.rs b/crates/shturman-ipc/src/lib.rs new file mode 100644 index 0000000..37092b5 --- /dev/null +++ b/crates/shturman-ipc/src/lib.rs @@ -0,0 +1,8 @@ +//! Контракт D-Bus Штурмана: имена/пути/версии интерфейсов, типы ошибок, enum-типы и `#[proxy]`-трейты. +//! Источник правды по шине (ipc.md). `sdk` и сервисы используют его по разные стороны границы +//! (architecture §3): сервисы реализуют `#[interface]`, клиенты берут `#[proxy]`. + +pub mod error; +pub mod names; + +pub use error::Error; diff --git a/crates/shturman-ipc/src/names.rs b/crates/shturman-ipc/src/names.rs new file mode 100644 index 0000000..e6772f4 --- /dev/null +++ b/crates/shturman-ipc/src/names.rs @@ -0,0 +1,27 @@ +//! Well-known имена / пути объектов / имена интерфейсов (ipc §2). +//! `ru.shturman.` · `/ru/shturman/` · `ru.shturman.N` (N = мажор). + +pub mod power { + pub const NAME: &str = "ru.shturman.Power"; + pub const PATH: &str = "/ru/shturman/Power"; + pub const IFACE: &str = "ru.shturman.Power1"; +} + +pub mod settings { + pub const NAME: &str = "ru.shturman.Settings"; + pub const PATH: &str = "/ru/shturman/Settings"; + pub const IFACE: &str = "ru.shturman.Settings1"; +} + +#[cfg(test)] +mod tests { + #[test] + fn names_follow_convention() { + assert_eq!(super::power::NAME, "ru.shturman.Power"); + assert_eq!(super::power::PATH, "/ru/shturman/Power"); + assert_eq!(super::power::IFACE, "ru.shturman.Power1"); + assert_eq!(super::settings::NAME, "ru.shturman.Settings"); + assert_eq!(super::settings::PATH, "/ru/shturman/Settings"); + assert_eq!(super::settings::IFACE, "ru.shturman.Settings1"); + } +}