pkg/backend/
mod.rs

1pub mod pkgar_backend;
2
3use std::io;
4use thiserror::Error;
5
6use crate::{
7    net_backend::DownloadError,
8    package::{PackageError, Repository},
9    Package, PackageName,
10};
11
12// todo: make this better
13#[derive(Error, Debug)]
14pub enum Error {
15    #[error("Please add repos")]
16    ValidRepoNotFound,
17    #[error("Repository path is not valid")]
18    RepoPathInvalid,
19    #[error("Cached package {0:?} source repo is not found")]
20    RepoCacheNotFound(PackageName),
21    #[error("Package {0:?} not found")]
22    PackageNotFound(PackageName),
23    #[error("Package {0:?} name invalid")]
24    PackageNameInvalid(String),
25    #[error("{0}")]
26    Package(#[from] PackageError),
27    #[error("Path {0:?} isn't a Valid Unicode String")]
28    PathIsNotValidUnicode(String),
29    #[error("You don't have permissions required for this action, try performing it as root")]
30    MissingPermissions,
31
32    #[error("Package {0:?} is protected")]
33    ProtectedPackage(PackageName),
34
35    #[error("IO error: {0}")]
36    IO(io::Error),
37    #[error("Download error: {0}")]
38    Download(#[from] DownloadError),
39    #[error("Download error: {0}")]
40    TomlRead(#[from] toml::de::Error),
41    #[error("pkgar_keys error: {0}")]
42    PkgarKeys(#[from] pkgar_keys::Error),
43    #[error("pkgar error: {0}")]
44    Pkgar(Box<pkgar::Error>),
45    #[error("pkgar error: {0}")]
46    PkgarAnyhow(#[from] anyhow::Error),
47}
48
49impl From<pkgar::Error> for Error {
50    fn from(value: pkgar::Error) -> Self {
51        Error::Pkgar(Box::new(value))
52    }
53}
54
55impl From<std::io::Error> for Error {
56    fn from(value: std::io::Error) -> Self {
57        if value.kind() == std::io::ErrorKind::PermissionDenied {
58            return Error::MissingPermissions;
59        } else {
60            return Error::IO(value);
61        }
62    }
63}
64
65pub trait Backend {
66    fn install(&mut self, package: PackageName) -> Result<(), Error>;
67    fn uninstall(&mut self, package: PackageName) -> Result<(), Error>;
68    fn upgrade(&mut self, package: PackageName) -> Result<(), Error>;
69    fn get_installed_packages(&self) -> Result<Vec<PackageName>, Error>;
70    fn get_package_detail(&self, package: &PackageName) -> Result<Package, Error>;
71    fn get_repository_detail(&self) -> Result<Repository, Error>;
72}