Sebastian Thielgit-odb with serde support0da930c6 years agoHistory
113 lines · 2.9 KB · Rust
RawDownload
use crate::ByteSlice;use nom::{lib::std::fmt::Formatter, lib::std::ops::Deref};use quick_error::quick_error; #[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone, Copy)]#[cfg_attr(feature = "serde1", derive(serde::Serialize, serde::Deserialize))]pub enum Sign {    Plus,    Minus,} #[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone, Copy)]#[cfg_attr(feature = "serde1", derive(serde::Serialize, serde::Deserialize))]pub struct Time {    /// time in seconds from epoch    pub time: u32,    /// time offset in seconds    pub offset: i32,    /// the sign seen in front of -0000    pub sign: Sign,} pub const SHA1_SIZE: usize = 20; /// A SHA1 identifying objects#[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone, Copy)]#[cfg_attr(feature = "serde1", derive(serde::Serialize, serde::Deserialize))]pub struct Id(pub [u8; SHA1_SIZE]); impl Id {    pub fn encode_to_40_bytes_slice(&self, out: &mut [u8]) -> Result<(), hex::FromHexError> {        hex::encode_to_slice(self.0, out)    }     pub fn from_20_bytes(b: &[u8]) -> Id {        let mut id = [0; SHA1_SIZE];        id.copy_from_slice(b);        Id(id)    }     pub fn from_hex(buf: &[u8]) -> Result<Id, hex::FromHexError> {        use hex::FromHex;        Ok(Id(<[u8; 20]>::from_hex(buf)?))    }     pub fn null() -> Id {        Id([0u8; 20])    }     pub fn as_slice(&self) -> &[u8] {        self.0.as_ref()    }} impl Deref for Id {    type Target = [u8];     fn deref(&self) -> &Self::Target {        &self.0[..]    }} impl std::fmt::Display for Id {    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {        let mut buf = [0u8; 40];        self.encode_to_40_bytes_slice(&mut buf).unwrap();        write!(f, "{}", &buf.as_bstr())    }} #[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone, Copy)]#[cfg_attr(feature = "serde1", derive(serde::Serialize, serde::Deserialize))]pub enum Kind {    Tree,    Blob,    Commit,    Tag,}quick_error! {    #[derive(Debug)]    pub enum Error {        InvalidObjectKind(kind: crate::BString) {            display("Unknown object kind: {:?}", std::str::from_utf8(&kind))        }    }} impl Kind {    pub fn from_bytes(s: &[u8]) -> Result<Kind, Error> {        Ok(match s {            b"tree" => Kind::Tree,            b"blob" => Kind::Blob,            b"commit" => Kind::Commit,            b"tag" => Kind::Tag,            _ => return Err(Error::InvalidObjectKind(s.into())),        })    }     pub fn to_bytes(&self) -> &[u8] {        match self {            Kind::Tree => b"tree",            Kind::Commit => b"commit",            Kind::Blob => b"blob",            Kind::Tag => b"tag",        }    }} impl std::fmt::Display for Kind {    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {        f.write_str(std::str::from_utf8(self.to_bytes()).expect("valid utf8 in kind name"))    }}