use crate::owned; use std::io; /// A mutable object representing [`Trees`][owned::Tree], [`Blobs`][owned::Blob], [`Commits`][owned::Commit] or [`Tags`][owned::Tag]. #[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone)] #[cfg_attr(feature = "serde1", derive(serde::Serialize, serde::Deserialize))] #[allow(clippy::large_enum_variant, missing_docs)] pub enum Object { Tree(owned::Tree), Blob(owned::Blob), Commit(owned::Commit), Tag(owned::Tag), } /// Convenient extraction of typed object. impl Object { /// Returns a [`Blob`][owned::Blob] if it is one. pub fn as_blob(&self) -> Option<&owned::Blob> { match self { Object::Blob(v) => Some(v), _ => None, } } /// Returns a [`Commit`][owned::Commit] if it is one. pub fn as_commit(&self) -> Option<&owned::Commit> { match self { Object::Commit(v) => Some(v), _ => None, } } /// Returns a [`Tree`][owned::Tree] if it is one. pub fn as_tree(&self) -> Option<&owned::Tree> { match self { Object::Tree(v) => Some(v), _ => None, } } /// Returns a [`Tag`][owned::Tag] if it is one. pub fn as_tag(&self) -> Option<&owned::Tag> { match self { Object::Tag(v) => Some(v), _ => None, } } /// Returns the kind of object stored in this instance. pub fn kind(&self) -> crate::Kind { match self { Object::Tree(_) => crate::Kind::Tree, Object::Blob(_) => crate::Kind::Blob, Object::Commit(_) => crate::Kind::Commit, Object::Tag(_) => crate::Kind::Tag, } } } /// Serialization impl Object { /// Write the contained object to `out` in the git serialization format. pub fn write_to(&self, out: impl io::Write) -> io::Result<()> { use Object::*; match self { Tree(v) => v.write_to(out), Blob(v) => v.write_to(out), Commit(v) => v.write_to(out), Tag(v) => v.write_to(out), } } } mod convert { use crate::owned::{Blob, Commit, Object, Tag, Tree}; use std::convert::TryFrom; impl From for Object { fn from(v: Tag) -> Self { Object::Tag(v) } } impl From for Object { fn from(v: Commit) -> Self { Object::Commit(v) } } impl From for Object { fn from(v: Tree) -> Self { Object::Tree(v) } } impl From for Object { fn from(v: Blob) -> Self { Object::Blob(v) } } impl TryFrom for Tag { type Error = Object; fn try_from(value: Object) -> Result { Ok(match value { Object::Tag(v) => v, _ => return Err(value), }) } } impl TryFrom for Commit { type Error = Object; fn try_from(value: Object) -> Result { Ok(match value { Object::Commit(v) => v, _ => return Err(value), }) } } impl TryFrom for Tree { type Error = Object; fn try_from(value: Object) -> Result { Ok(match value { Object::Tree(v) => v, _ => return Err(value), }) } } impl TryFrom for Blob { type Error = Object; fn try_from(value: Object) -> Result { Ok(match value { Object::Blob(v) => v, _ => return Err(value), }) } } }