Skip to main content

gitserver_core/
error.rs

1use std::path::PathBuf;
2
3#[derive(Debug, thiserror::Error)]
4pub enum Error {
5    #[error("repository not found: {0}")]
6    RepoNotFound(String),
7
8    #[error("path traversal rejected: {0}")]
9    PathTraversal(PathBuf),
10
11    #[error("invalid repository at {0}: {1}")]
12    InvalidRepo(PathBuf, String),
13
14    #[error("protocol error: {0}")]
15    Protocol(String),
16
17    #[error("git operation failed: {0}")]
18    Git(Box<gix::open::Error>),
19
20    #[error("io error: {0}")]
21    Io(#[from] std::io::Error),
22}
23
24impl From<gix::open::Error> for Error {
25    fn from(e: gix::open::Error) -> Self {
26        Error::Git(Box::new(e))
27    }
28}
29
30pub type Result<T> = std::result::Result<T, Error>;
31
32#[cfg(test)]
33mod tests {
34    use super::*;
35
36    #[test]
37    fn error_display_repo_not_found() {
38        let err = Error::RepoNotFound("foo/bar.git".into());
39        assert_eq!(err.to_string(), "repository not found: foo/bar.git");
40    }
41
42    #[test]
43    fn error_display_path_traversal() {
44        let err = Error::PathTraversal(PathBuf::from("../etc/passwd"));
45        assert_eq!(err.to_string(), "path traversal rejected: ../etc/passwd");
46    }
47}