use std::fmt::{Debug, Display, Formatter, Result};
pub struct Reference<'a>(git2::Reference<'a>);
impl Reference<'_> {
pub fn name(&self) -> Option<&str> {
self.0.name()
}
pub fn shorthand(&self) -> Option<&str> {
self.0.shorthand()
}
}
impl Debug for Reference<'_> {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
f.debug_struct("Reference")
.field("name", &self.name())
.finish()
}
}
impl Display for Reference<'_> {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
match self.shorthand() {
Some(name) => write!(f, "{}", name),
None => write!(f, "<unnamed>"),
}
}
}
impl<'a> From<git2::Reference<'a>> for Reference<'a> {
fn from(reference: git2::Reference<'a>) -> Self {
Reference(reference)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::test_utilities;
#[test]
fn test_name() {
let (_tempdir, repo) = test_utilities::create_mock_repo();
let reference = repo.head().unwrap();
let binding = Reference::from(reference);
let name = binding.name().unwrap();
assert_eq!(name, "refs/heads/main");
}
#[test]
fn test_shorthand() {
let (_tempdir, repo) = test_utilities::create_mock_repo();
let reference = repo.head().unwrap();
let binding = Reference::from(reference);
let shorthand = binding.shorthand().unwrap();
assert_eq!(shorthand, "main");
}
#[test]
fn test_display() {
let (_tempdir, repo) = test_utilities::create_mock_repo();
let reference = repo.head().unwrap();
let binding = Reference::from(reference);
assert_eq!(format!("{}", binding), "main");
}
}