136 lines · 3.5 KB · Rust
RawDownload
mod error;pub use error::Error; use crate::BStr;use crate::{    borrowed,    borrowed::{Blob, Commit, Tag, Tree},    Time,}; #[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone)]#[cfg_attr(feature = "serde1", derive(serde::Serialize, serde::Deserialize))]pub struct Signature<'data> {    #[cfg_attr(feature = "serde1", serde(borrow))]    pub name: &'data BStr,    pub email: &'data BStr,    pub time: Time,} #[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone)]#[cfg_attr(feature = "serde1", derive(serde::Serialize, serde::Deserialize))]pub enum Object<'data> {    #[cfg_attr(feature = "serde1", serde(borrow))]    Tag(Tag<'data>),    Commit(Commit<'data>),    Tree(Tree<'data>),    Blob(Blob<'data>),} impl<'data> Object<'data> {    pub fn as_blob(&self) -> Option<&borrowed::Blob> {        match self {            Object::Blob(v) => Some(v),            _ => None,        }    }    pub fn as_commit(&self) -> Option<&borrowed::Commit<'data>> {        match self {            Object::Commit(v) => Some(v),            _ => None,        }    }    pub fn as_tree(&self) -> Option<&borrowed::Tree> {        match self {            Object::Tree(v) => Some(v),            _ => None,        }    }    pub fn as_tag(&self) -> Option<&borrowed::Tag> {        match self {            Object::Tag(v) => Some(v),            _ => None,        }    }    pub fn kind(&self) -> crate::Kind {        match self {            Object::Tag(_) => crate::Kind::Tag,            Object::Commit(_) => crate::Kind::Commit,            Object::Tree(_) => crate::Kind::Tree,            Object::Blob(_) => crate::Kind::Blob,        }    }} mod convert {    use crate::borrowed::{Blob, Commit, Object, Tag, Tree};    use std::convert::TryFrom;     impl<'data> From<Tag<'data>> for Object<'data> {        fn from(v: Tag<'data>) -> Self {            Object::Tag(v)        }    }     impl<'data> From<Commit<'data>> for Object<'data> {        fn from(v: Commit<'data>) -> Self {            Object::Commit(v)        }    }     impl<'data> From<Tree<'data>> for Object<'data> {        fn from(v: Tree<'data>) -> Self {            Object::Tree(v)        }    }     impl<'data> From<Blob<'data>> for Object<'data> {        fn from(v: Blob<'data>) -> Self {            Object::Blob(v)        }    }     impl<'data> TryFrom<Object<'data>> for Tag<'data> {        type Error = Object<'data>;         fn try_from(value: Object<'data>) -> Result<Self, Self::Error> {            Ok(match value {                Object::Tag(v) => v,                _ => return Err(value),            })        }    }     impl<'data> TryFrom<Object<'data>> for Commit<'data> {        type Error = Object<'data>;         fn try_from(value: Object<'data>) -> Result<Self, Self::Error> {            Ok(match value {                Object::Commit(v) => v,                _ => return Err(value),            })        }    }     impl<'data> TryFrom<Object<'data>> for Tree<'data> {        type Error = Object<'data>;         fn try_from(value: Object<'data>) -> Result<Self, Self::Error> {            Ok(match value {                Object::Tree(v) => v,                _ => return Err(value),            })        }    }     impl<'data> TryFrom<Object<'data>> for Blob<'data> {        type Error = Object<'data>;         fn try_from(value: Object<'data>) -> Result<Self, Self::Error> {            Ok(match value {                Object::Blob(v) => v,                _ => return Err(value),            })        }    }}