1pub use types::inner as global;
7
8mod macros;
9pub mod messages;
10mod types;
11
12use messages::*;
13use server::{CheckedConn, CheckedPermissions, MessageAllowed};
14
15#[macro_export]
16macro_rules! use_api {
17 ($settings:path, $server:path) => {
18 mod settings_permissions {
19 use settings::messages::*;
20 use $server as server;
21 pub use $settings as settings;
22 #[derive(Clone, Default, server::Permissions)]
23 #[server_name = "os/settings"]
24 pub struct SettingsPermissions;
25 }
26 type SettingsApi =
27 settings_permissions::settings::SettingsApi<settings_permissions::SettingsPermissions>;
28 };
29 () => {
30 settings::use_api!(settings, server);
31 };
32}
33
34#[derive(Debug, Default, Clone)]
35pub struct SettingsApi<P: CheckedPermissions> {
36 pub(crate) conn: CheckedConn<P>,
37}
38
39impl<P: CheckedPermissions> SettingsApi<P> {
40 pub fn get_prime_color(&self) -> global::SystemTheme
41 where
42 P: MessageAllowed<GetPrimeColor>,
43 {
44 self.conn.send_blocking_scalar(GetPrimeColor)
45 }
46
47 pub fn flush_settings(&self)
48 where
49 P: MessageAllowed<FlushAll>,
50 {
51 self.conn.send_scalar(FlushAll { force: true })
52 }
53
54 pub fn wait_for_onboarding_complete(&self)
55 where
56 P: 'static,
57 P: MessageAllowed<SubscribeOnboardingStatus>,
58 {
59 server::listen(WaitForOnboarding(self.clone()));
60 }
61
62 pub fn lookup_timezone(&self, name: String, offset_minutes: i32) -> global::TimeZone
63 where
64 P: MessageAllowed<LookupTimeZone>,
65 {
66 self.conn.send_blocking_archive(LookupTimeZone { name, offset_minutes })
67 }
68}
69
70pub struct WaitForOnboarding<P: CheckedPermissions>(pub SettingsApi<P>);
71
72impl<P: CheckedPermissions> server::ServerMessages for WaitForOnboarding<P> {
73 const NAME: &'static str = "";
74
75 fn messages() -> &'static [server::MessageDef<Self>]
76 where
77 Self: Sized,
78 {
79 &[]
80 }
81}
82
83impl<P: CheckedPermissions> server::Server for WaitForOnboarding<P>
84where
85 P: MessageAllowed<SubscribeOnboardingStatus>,
86{
87 fn on_start(&mut self, context: &mut server::ServerContext<Self>) {
88 self.0.server_subscribe_onboarding_status(context);
89 }
90}
91
92impl<P: CheckedPermissions> server::ArchiveEventHandler<global::OnboardingStatus> for WaitForOnboarding<P>
93where
94 P: MessageAllowed<SubscribeOnboardingStatus>,
95{
96 fn handle(
97 &mut self,
98 msg: server::Owned<global::OnboardingStatus>,
99 _sender: xous::PID,
100 context: &mut server::ServerContext<Self>,
101 ) {
102 if msg.is_complete() {
103 context.shutdown();
104 }
105 }
106}