1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
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), }) } } }