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
//! The types of objects for which a `GitOid` can be made.
use crate::sealed::Sealed;
#[cfg(doc)]
use crate::GitOid;
/// Object types usable to construct a [`GitOid`].
///
/// This is a sealed trait to ensure it's only used for hash
/// algorithms which are actually supported by Git.
///
/// For more information on sealed traits, read Predrag
/// Gruevski's ["A Definitive Guide to Sealed Traits in Rust"][1].
///
/// [1]: https://predr.ag/blog/definitive-guide-to-sealed-traits-in-rust/
pub trait ObjectType: Sealed {
#[doc(hidden)]
const NAME: &'static str;
}
macro_rules! define_object_type {
( $name:tt, $s:literal ) => {
impl Sealed for $name {}
impl ObjectType for $name {
const NAME: &'static str = $s;
}
};
}
/// A Blob GitOid object.
pub struct Blob {
#[doc(hidden)]
_private: (),
}
define_object_type!(Blob, "blob");
/// A Tree GitOid object.
pub struct Tree {
#[doc(hidden)]
_private: (),
}
define_object_type!(Tree, "tree");
/// A Tag GitOid object.
pub struct Tag {
#[doc(hidden)]
_private: (),
}
define_object_type!(Tag, "tag");
/// A Commit GitOid object.
pub struct Commit {
_private: (),
}
define_object_type!(Commit, "commit");