use std::{
path::{Path, PathBuf},
sync::mpsc::Sender,
};
use crate::bundle::Manifest;
use crate::*;
use super::UpdateSource;
#[derive(Clone)]
pub struct FileSource {
path: PathBuf,
}
impl FileSource {
pub fn new<P: AsRef<Path>>(path: P) -> FileSource {
let path = path.as_ref();
FileSource { path: PathBuf::from(path) }
}
}
impl UpdateSource for FileSource {
fn get_release_feed(&self, channel: &str, _: &Manifest, _staged_user_id: &str) -> Result<VelopackAssetFeed, Error> {
let releases_name = format!("releases.{}.json", channel);
let releases_path = self.path.join(&releases_name);
info!("Reading releases from file: {:?}", releases_path);
let json = std::fs::read_to_string(releases_path)?;
let feed: VelopackAssetFeed = serde_json::from_str(&json)?;
Ok(feed)
}
fn download_release_entry(&self, asset: &VelopackAsset, local_file: &Path, progress_sender: Option<Sender<i16>>) -> Result<(), Error> {
let asset_path = self.path.join(&asset.FileName);
info!("About to copy from file '{:?}' to file '{:?}'", asset_path, local_file);
if let Some(progress_sender) = &progress_sender {
let _ = progress_sender.send(50);
}
std::fs::copy(asset_path, local_file)?;
if let Some(progress_sender) = &progress_sender {
let _ = progress_sender.send(100);
}
Ok(())
}
}