ips/libips/src/repository/mod.rs

97 lines
3.2 KiB
Rust
Raw Normal View History

// This Source Code Form is subject to the terms of
// the Mozilla Public License, v. 2.0. If a copy of the
// MPL was not distributed with this file, You can
// obtain one at https://mozilla.org/MPL/2.0/.
use anyhow::Result;
use std::path::Path;
use std::collections::HashMap;
mod file_backend;
mod rest_backend;
pub use file_backend::FileBackend;
pub use rest_backend::RestBackend;
/// Repository configuration filename
pub const REPOSITORY_CONFIG_FILENAME: &str = "pkg6.repository";
/// Repository version
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum RepositoryVersion {
V4 = 4,
}
impl Default for RepositoryVersion {
fn default() -> Self {
RepositoryVersion::V4
}
}
impl std::convert::TryFrom<u32> for RepositoryVersion {
type Error = anyhow::Error;
fn try_from(value: u32) -> Result<Self, Self::Error> {
match value {
4 => Ok(RepositoryVersion::V4),
_ => Err(anyhow::anyhow!("Unsupported repository version: {}", value)),
}
}
}
/// Repository configuration
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct RepositoryConfig {
pub version: RepositoryVersion,
pub publishers: Vec<String>,
pub properties: HashMap<String, String>,
}
impl Default for RepositoryConfig {
fn default() -> Self {
RepositoryConfig {
version: RepositoryVersion::default(),
publishers: Vec::new(),
properties: HashMap::new(),
}
}
}
/// Repository trait defining the interface for all repository backends
pub trait Repository {
/// Create a new repository at the specified path
fn create<P: AsRef<Path>>(path: P, version: RepositoryVersion) -> Result<Self> where Self: Sized;
/// Open an existing repository
fn open<P: AsRef<Path>>(path: P) -> Result<Self> where Self: Sized;
/// Save the repository configuration
fn save_config(&self) -> Result<()>;
/// Add a publisher to the repository
fn add_publisher(&mut self, publisher: &str) -> Result<()>;
/// Remove a publisher from the repository
fn remove_publisher(&mut self, publisher: &str, dry_run: bool) -> Result<()>;
/// Get repository information
fn get_info(&self) -> Result<Vec<(String, usize, String, String)>>;
/// Set a repository property
fn set_property(&mut self, property: &str, value: &str) -> Result<()>;
/// Set a publisher property
fn set_publisher_property(&mut self, publisher: &str, property: &str, value: &str) -> Result<()>;
/// List packages in the repository
fn list_packages(&self, publisher: Option<&str>, pattern: Option<&str>) -> Result<Vec<(String, String, String)>>;
/// Show contents of packages
fn show_contents(&self, publisher: Option<&str>, pattern: Option<&str>, action_types: Option<&[String]>) -> Result<Vec<(String, String, String)>>;
/// Rebuild repository metadata
fn rebuild(&self, publisher: Option<&str>, no_catalog: bool, no_index: bool) -> Result<()>;
/// Refresh repository metadata
fn refresh(&self, publisher: Option<&str>, no_catalog: bool, no_index: bool) -> Result<()>;
}