use std::ffi::OsStr;
use crate::branch::Branch;
use crate::commit_id::CommitId;
use crate::tag::Tag;
#[derive(Clone, Copy, Debug)]
pub enum CommitIsh<'a> {
Branch(&'a Branch),
Tag(&'a Tag),
Commit(&'a CommitId),
}
impl AsRef<OsStr> for CommitIsh<'_> {
fn as_ref(&self) -> &OsStr {
match self {
Self::Branch(branch) => branch.as_ref(),
Self::Tag(tag) => tag.as_ref(),
Self::Commit(commit) => commit.as_ref(),
}
}
}
impl<'a> From<&'a Branch> for CommitIsh<'a> {
fn from(value: &'a Branch) -> Self {
Self::Branch(value)
}
}
impl<'a> From<&'a Tag> for CommitIsh<'a> {
fn from(value: &'a Tag) -> Self {
Self::Tag(value)
}
}
impl<'a> From<&'a CommitId> for CommitIsh<'a> {
fn from(value: &'a CommitId) -> Self {
Self::Commit(value)
}
}
#[derive(Debug)]
pub struct NoTarget;
#[derive(Debug)]
pub struct WithTarget<'a> {
pub(crate) target: CommitIsh<'a>,
}