gitserver-core 0.0.2

Core Git protocol operations for gitserver
Documentation
use std::path::PathBuf;

#[derive(Debug, thiserror::Error)]
pub enum Error {
    #[error("repository not found: {0}")]
    RepoNotFound(String),

    #[error("path traversal rejected: {0}")]
    PathTraversal(PathBuf),

    #[error("invalid repository at {0}: {1}")]
    InvalidRepo(PathBuf, String),

    #[error("protocol error: {0}")]
    Protocol(String),

    #[error("git operation failed: {0}")]
    Git(Box<gix::open::Error>),

    #[error("io error: {0}")]
    Io(#[from] std::io::Error),
}

impl From<gix::open::Error> for Error {
    fn from(e: gix::open::Error) -> Self {
        Error::Git(Box::new(e))
    }
}

pub type Result<T> = std::result::Result<T, Error>;

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn error_display_repo_not_found() {
        let err = Error::RepoNotFound("foo/bar.git".into());
        assert_eq!(err.to_string(), "repository not found: foo/bar.git");
    }

    #[test]
    fn error_display_path_traversal() {
        let err = Error::PathTraversal(PathBuf::from("../etc/passwd"));
        assert_eq!(err.to_string(), "path traversal rejected: ../etc/passwd");
    }
}