From bfe490e8990423f6d54fa46b1287ef303736d5d9 Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 24 Jun 2026 14:36:50 +0300 Subject: [PATCH] =?UTF-8?q?refactor(review):=20shell=20current-thread=20ru?= =?UTF-8?q?ntime=20+=20=D0=B5=D0=B4=D0=B8=D0=BD=D1=8B=D0=B9=20=D0=B4=D0=B5?= =?UTF-8?q?=D1=84=D0=BE=D0=BB=D1=82;=20PowerClient=20parse=5Fenum;=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=BD=D0=B0=20ipc::names?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - shell: new_current_thread рантайм (без пула на холодном старте, #11); единый Initial::default(). - PowerClient: generic parse_enum (убрал 3 копии map_err). - ipc::names::power::MOCK_IFACE; интеграционные тесты — через ipc::names (не хардкод). Co-Authored-By: Claude Opus 4.8 Signed-off-by: Alexander --- crates/apps/shturman-shell/src/main.rs | 13 +++++++++---- crates/core/shturman-power/tests/integration.rs | 14 +++++++------- .../core/shturman-settings/tests/integration.rs | 5 +++-- crates/shturman-ipc/src/names.rs | 2 ++ crates/shturman-sdk/src/power.rs | 17 ++++++++--------- 5 files changed, 29 insertions(+), 22 deletions(-) diff --git a/crates/apps/shturman-shell/src/main.rs b/crates/apps/shturman-shell/src/main.rs index 48601b5..30ac4c6 100644 --- a/crates/apps/shturman-shell/src/main.rs +++ b/crates/apps/shturman-shell/src/main.rs @@ -83,7 +83,11 @@ impl Default for Initial { /// Одноразовое чтение состояния с шины (best-effort). Без шины/сервисов — дефолты (#4). fn read_initial() -> Initial { - let rt = match tokio::runtime::Runtime::new() { + // current-thread рантайм: одно best-effort чтение на холодном старте, без пула потоков (#11). + let rt = match tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + { Ok(rt) => rt, Err(_) => return Initial::default(), }; @@ -99,6 +103,7 @@ fn read_initial() -> Initial { } async fn connect_and_read() -> anyhow::Result { + let def = Initial::default(); // единый источник дефолтов (без дублей литералов) let conn = shturman_sdk::connect().await?; let settings = shturman_sdk::SettingsClient::new(&conn).await?; let theme = settings @@ -106,17 +111,17 @@ async fn connect_and_read() -> anyhow::Result { .await .ok() .and_then(|v| String::try_from(v).ok()) - .unwrap_or_else(|| "auto".into()); + .unwrap_or(def.theme); let power = shturman_sdk::PowerClient::new(&conn).await?; let ignition = power .ignition_state() .await .map(|i| i.as_str().to_string()) - .unwrap_or_else(|_| "unknown".into()); + .unwrap_or(def.ignition); Ok(Initial { theme, ignition, - network: "unknown".into(), + network: def.network, }) } diff --git a/crates/core/shturman-power/tests/integration.rs b/crates/core/shturman-power/tests/integration.rs index da5ca98..005c799 100644 --- a/crates/core/shturman-power/tests/integration.rs +++ b/crates/core/shturman-power/tests/integration.rs @@ -2,7 +2,7 @@ //! Проверяет state по шине и fake-ACC: `dev.PowerMock1.SetAcc` → сигнал `Power1.AccChanged`. use futures_util::StreamExt; -use shturman_ipc::types::PowerState; +use shturman_ipc::{names, types::PowerState}; use shturman_power::PowerService; use shturman_sdk::PowerClient; @@ -16,15 +16,15 @@ async fn power_state_and_fake_acc() { let server = zbus::Connection::session().await.unwrap(); server .object_server() - .at("/ru/shturman/Power", svc) + .at(names::power::PATH, svc) .await .unwrap(); server .object_server() - .at("/ru/shturman/Power", mock) + .at(names::power::PATH, mock) .await .unwrap(); - server.request_name("ru.shturman.Power").await.unwrap(); + server.request_name(names::power::NAME).await.unwrap(); let client_conn = zbus::Connection::session().await.unwrap(); let power = PowerClient::new(&client_conn).await.unwrap(); @@ -36,9 +36,9 @@ async fn power_state_and_fake_acc() { // dev.PowerMock1.SetAcc(false) сырым D-Bus-вызовом client_conn .call_method( - Some("ru.shturman.Power"), - "/ru/shturman/Power", - Some("ru.shturman.dev.PowerMock1"), + Some(names::power::NAME), + names::power::PATH, + Some(names::power::MOCK_IFACE), "SetAcc", &(false,), ) diff --git a/crates/core/shturman-settings/tests/integration.rs b/crates/core/shturman-settings/tests/integration.rs index 9b5f564..0901f3e 100644 --- a/crates/core/shturman-settings/tests/integration.rs +++ b/crates/core/shturman-settings/tests/integration.rs @@ -3,6 +3,7 @@ use futures_util::StreamExt; use shturman_common::Layout; +use shturman_ipc::names; use shturman_sdk::SettingsClient; use shturman_settings::{store::Store, SettingsService}; use zbus::zvariant::Value; @@ -17,10 +18,10 @@ async fn settings_round_trip_and_changed() { let server = zbus::Connection::session().await.unwrap(); server .object_server() - .at("/ru/shturman/Settings", SettingsService::new(store)) + .at(names::settings::PATH, SettingsService::new(store)) .await .unwrap(); - server.request_name("ru.shturman.Settings").await.unwrap(); + server.request_name(names::settings::NAME).await.unwrap(); // клиент на отдельном соединении let client_conn = zbus::Connection::session().await.unwrap(); diff --git a/crates/shturman-ipc/src/names.rs b/crates/shturman-ipc/src/names.rs index e6772f4..5b9ef92 100644 --- a/crates/shturman-ipc/src/names.rs +++ b/crates/shturman-ipc/src/names.rs @@ -5,6 +5,8 @@ pub mod power { pub const NAME: &str = "ru.shturman.Power"; pub const PATH: &str = "/ru/shturman/Power"; pub const IFACE: &str = "ru.shturman.Power1"; + /// dev-mock «fake-ACC» (интерфейс на том же объекте; только dev-сборка). + pub const MOCK_IFACE: &str = "ru.shturman.dev.PowerMock1"; } pub mod settings { diff --git a/crates/shturman-sdk/src/power.rs b/crates/shturman-sdk/src/power.rs index d710d3c..c593b81 100644 --- a/crates/shturman-sdk/src/power.rs +++ b/crates/shturman-sdk/src/power.rs @@ -5,6 +5,11 @@ use shturman_ipc::proxy::Power1Proxy; use shturman_ipc::types::{IgnitionState, PowerSource, PowerState}; use zbus::Connection; +/// Распарсить enum-строку с провода; неизвестное значение → zbus-ошибка с меткой типа. +fn parse_enum(label: &str, raw: String) -> zbus::Result { + T::from_str(&raw).map_err(|_| zbus::Error::Failure(format!("unknown {label}: {raw}"))) +} + /// Эргономичный клиент `ru.shturman.Power`. pub struct PowerClient { proxy: Power1Proxy<'static>, @@ -18,21 +23,15 @@ impl PowerClient { } pub async fn power_state(&self) -> zbus::Result { - let s = self.proxy.get_power_state().await?; - PowerState::from_str(&s) - .map_err(|_| zbus::Error::Failure(format!("unknown PowerState: {s}"))) + parse_enum("PowerState", self.proxy.get_power_state().await?) } pub async fn ignition_state(&self) -> zbus::Result { - let s = self.proxy.ignition_state().await?; - IgnitionState::from_str(&s) - .map_err(|_| zbus::Error::Failure(format!("unknown IgnitionState: {s}"))) + parse_enum("IgnitionState", self.proxy.ignition_state().await?) } pub async fn power_source(&self) -> zbus::Result { - let s = self.proxy.power_source().await?; - PowerSource::from_str(&s) - .map_err(|_| zbus::Error::Failure(format!("unknown PowerSource: {s}"))) + parse_enum("PowerSource", self.proxy.power_source().await?) } pub async fn uptime(&self) -> zbus::Result {