1#![allow(clippy::let_unit_value)]
6
7use isolated_swd::omaha;
8use isolated_swd::updater::Updater;
9use thiserror::Error;
10
11#[derive(Debug, Error)]
12pub enum UpdateError {
13 #[error("error launching pkg-cache")]
14 PkgCacheLaunchError(#[source] anyhow::Error),
15
16 #[error("error launching pkg-resolver")]
17 PkgResolverLaunchError(#[source] anyhow::Error),
18
19 #[error("error launching system-updater and installing update")]
20 InstallError(#[source] anyhow::Error),
21
22 #[error("error setting up resources")]
23 FidlError(#[source] fidl::Error),
24
25 #[error("IO error occurred")]
26 IoError(#[source] std::io::Error),
27
28 #[error("error connecting to system-updater")]
29 UpdaterConnectError(#[source] anyhow::Error),
30}
31
32pub struct OmahaConfig {
33 pub app_id: String,
35 pub server_url: String,
37}
38
39pub enum UpdateUrlSource {
41 OmahaConfig(OmahaConfig),
43
44 UpdateUrl(url::Url),
46
47 UseDefault,
49}
50
51pub async fn download_and_apply_update_with_updater(
56 mut updater: Updater,
57 channel_name: &str,
58 version: &str,
59 update_url_source: UpdateUrlSource,
60) -> Result<(), UpdateError> {
61 match update_url_source {
62 UpdateUrlSource::OmahaConfig(cfg) => {
63 let () = omaha::install_update(
64 updater,
65 cfg.app_id,
66 cfg.server_url,
67 version.to_owned(),
68 channel_name.to_owned(),
69 )
70 .await
71 .map_err(UpdateError::InstallError)?;
72 }
73 UpdateUrlSource::UpdateUrl(url) => {
74 let () = updater
75 .install_update(Some(&url), None)
76 .await
77 .map_err(UpdateError::InstallError)?;
78 }
79 UpdateUrlSource::UseDefault => {
80 let () = updater.install_update(None, None).await.map_err(UpdateError::InstallError)?;
81 }
82 }
83 Ok(())
84}
85
86pub async fn download_and_apply_update(
104 channel_name: &str,
105 version: &str,
106 omaha_cfg: Option<OmahaConfig>,
107) -> Result<(), UpdateError> {
108 let updater = Updater::new().map_err(UpdateError::UpdaterConnectError)?;
109 let update_url_source = if let Some(omaha_cfg) = omaha_cfg {
110 UpdateUrlSource::OmahaConfig(omaha_cfg)
111 } else {
112 UpdateUrlSource::UseDefault
113 };
114 download_and_apply_update_with_updater(updater, channel_name, version, update_url_source).await
115}