use self_update::{cargo_crate_version, Release, ReleaseAsset, ReleaseSource};
#[derive(Clone)]
struct MyHost;
impl ReleaseSource for MyHost {
fn get_latest_release(&self) -> self_update::Result<Release> {
Release::builder()
.version("1.2.3")
.asset(ReleaseAsset::new(
"myapp-x86_64-unknown-linux-gnu.tar.gz",
"https://releases.example.com/myapp/v1.2.3/myapp-x86_64-unknown-linux-gnu.tar.gz",
))
.build()
}
fn get_latest_releases(&self, _current: &str) -> self_update::Result<Vec<Release>> {
Ok(vec![self.get_latest_release()?])
}
fn get_release_version(&self, ver: &str) -> self_update::Result<Release> {
Release::builder()
.version(ver)
.asset(ReleaseAsset::new(
format!("myapp-{ver}-x86_64-unknown-linux-gnu.tar.gz"),
format!(
"https://releases.example.com/myapp/v{ver}/myapp-{ver}-x86_64-unknown-linux-gnu.tar.gz"
),
))
.build()
}
}
#[cfg(feature = "async")]
#[allow(dead_code)]
mod async_update {
use self_update::backends::custom::{AsyncUpdate, Blocking};
use self_update::{AsyncReleaseSource, Release, ReleaseAsset};
struct MyAsyncHost;
impl AsyncReleaseSource for MyAsyncHost {
async fn get_latest_release(&self) -> self_update::Result<Release> {
Release::builder()
.version("1.2.3")
.asset(ReleaseAsset::new(
"myapp-x86_64-unknown-linux-gnu.tar.gz",
"https://releases.example.com/myapp/v1.2.3/myapp-x86_64-unknown-linux-gnu.tar.gz",
))
.build()
}
async fn get_latest_releases(&self, _current: &str) -> self_update::Result<Vec<Release>> {
Ok(vec![self.get_latest_release().await?])
}
async fn get_release_version(&self, ver: &str) -> self_update::Result<Release> {
Release::builder()
.version(ver)
.asset(ReleaseAsset::new(
format!("myapp-{ver}-x86_64-unknown-linux-gnu.tar.gz"),
format!("https://releases.example.com/myapp/v{ver}/myapp-{ver}-x86_64-unknown-linux-gnu.tar.gz"),
))
.build()
}
}
pub async fn run_native_async() -> Result<(), Box<dyn std::error::Error>> {
let status = AsyncUpdate::configure()
.source(MyAsyncHost)
.bin_name("myapp")
.show_download_progress(true)
.current_version(self_update::cargo_crate_version!())
.build_async()?
.update_async()
.await?;
println!("Update status: `{}`!", status.version());
Ok(())
}
pub async fn run_blocking_adapter() -> Result<(), Box<dyn std::error::Error>> {
use super::MyHost;
let status = AsyncUpdate::configure()
.source(Blocking::new(MyHost))
.bin_name("myapp")
.show_download_progress(true)
.current_version(self_update::cargo_crate_version!())
.build_async()?
.update_async()
.await?;
println!("Update status: `{}`!", status.version());
Ok(())
}
}
fn run() -> Result<(), Box<dyn ::std::error::Error>> {
let status = self_update::backends::custom::Update::configure()
.source(MyHost)
.bin_name("myapp")
.show_download_progress(true)
.current_version(cargo_crate_version!())
.build()?
.update()?;
println!("Update status: `{}`!", status.version());
Ok(())
}
pub fn main() {
if let Err(e) = run() {
println!("[ERROR] {}", e);
::std::process::exit(1);
}
}