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#[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}