diff --git a/crates/core/src/main.rs b/crates/core/src/main.rs index 04f5e76..12670f7 100644 --- a/crates/core/src/main.rs +++ b/crates/core/src/main.rs @@ -14,6 +14,7 @@ use iced_layershell::settings::{LayerShellSettings, Settings, StartMode}; use iced_layershell::to_layer_message; use common::{BarModule, ModuleEffect, ModuleMsg, Service as ModuleService, ServicePayloadKind}; +use services::IntoSubscription; mod popup; @@ -96,8 +97,9 @@ fn gather_subscriptions(bar: &Bar) -> Subscription { bar.routes .values() .flat_map(|wants| wants.iter()) - .map(|service| { - services::subscription(service) + .map(|&service| { + service + .into_subscription() .map(|event| Message::Event(Msg::Subscription(event))) }) .collect::>(), diff --git a/crates/services/src/lib.rs b/crates/services/src/lib.rs index 2ad0e16..8131417 100644 --- a/crates/services/src/lib.rs +++ b/crates/services/src/lib.rs @@ -1,14 +1,24 @@ //! Service registry: turns a route key into the subscription that backs it. //! Adding a service is a new crate under `crates/services/` plus one arm in -//! `subscription` — core never changes. +//! the impl below — core never changes. use iced::Subscription; use common::{Service, ServicePayloadKind}; -/// The subscription backing a route key. -pub fn subscription(service: &Service) -> Subscription { - match service { - Service::Clock(_) => service_datetime::ClockTicker::run(), +/// Conversion from a route key to the subscription backing it. +/// +/// An extension trait (not `impl From for Subscription<...>`) because +/// both `Service` and `Subscription` are foreign to this crate — the orphan +/// rule blocks a foreign trait (`From`) on a foreign type (`Subscription`). +pub trait IntoSubscription { + fn into_subscription(self) -> Subscription; +} + +impl IntoSubscription for Service { + fn into_subscription(self) -> Subscription { + match self { + Service::Clock(_) => service_datetime::ClockTicker::run(), + } } }