hpk-update/src/lib.rs

90 lines
2.1 KiB
Rust

use hpk_package::{Arch, Package, Version};
use serde::{Deserialize, Serialize};
use std::{fmt, path::PathBuf};
#[cfg(feature = "client")]
pub mod client;
#[cfg(feature = "server")]
pub mod server;
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct PackageSpec {
name: String,
version: Version,
arch: Arch,
release: u8,
}
impl fmt::Display for PackageSpec {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"{}-{}_{}_{}",
self.name, self.version, self.arch, self.release
)
}
}
impl From<Package> for PackageSpec {
fn from(value: Package) -> Self {
Self {
name: value.name,
version: value.version,
arch: value.arch,
release: value.release,
}
}
}
impl From<&Package> for PackageSpec {
fn from(value: &Package) -> Self {
Self {
name: value.name.to_string(),
version: value.version.clone(),
arch: value.arch,
release: value.release,
}
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Item {
pub pspec: PackageSpec,
pub path: PathBuf,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub enum Request {
Catalog,
Packages(Vec<PackageSpec>),
Updates(Vec<Item>),
}
impl From<Vec<PackageSpec>> for Request {
fn from(value: Vec<PackageSpec>) -> Self {
Self::Packages(value)
}
}
impl From<Vec<Item>> for Request {
fn from(value: Vec<Item>) -> Self {
Self::Updates(value)
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub enum ResponseHeader {
/// The server is sending it's catalog
Catalog,
/// The server is sending a package, captured value is it's length. A new header will be sent
/// for each subsequent file.
Package(usize),
/// The server is sending an archive of updated files
Updates,
/// One or more requested packages are not on the server
PackageNotFound(Vec<PackageSpec>),
/// One or more requested update files are not on the server
FileNotFound(Vec<Item>),
}