use async_trait::async_trait;
use semver::{Version, VersionReq};
use std::fmt::Debug;
#[async_trait]
pub trait Repository: Debug + Send + Sync {
fn name(&self) -> &str;
async fn get_version(&self, version_req: &VersionReq) -> crate::Result<Version>;
async fn get_archive(&self, version_req: &VersionReq) -> crate::Result<Archive>;
}
#[derive(Clone, Debug)]
pub struct Archive {
name: String,
version: Version,
bytes: Vec<u8>,
}
impl Archive {
#[must_use]
pub fn new(name: String, version: Version, bytes: Vec<u8>) -> Self {
Self {
name,
version,
bytes,
}
}
#[must_use]
pub fn name(&self) -> &str {
&self.name
}
#[must_use]
pub fn version(&self) -> &Version {
&self.version
}
#[must_use]
pub fn bytes(&self) -> &[u8] {
&self.bytes
}
}
#[cfg(test)]
mod tests {
use super::*;
use semver::Version;
#[test]
fn test_archive() {
let name = "test".to_string();
let version = Version::parse("1.0.0").unwrap();
let bytes = vec![0, 1, 2, 3];
let archive = Archive::new(name.clone(), version.clone(), bytes.clone());
assert_eq!(archive.name(), name);
assert_eq!(archive.version(), &version);
assert_eq!(archive.bytes(), bytes.as_slice());
}
}