1use crate::Spec;
2
3#[derive(Debug, Copy, Clone, PartialOrd, PartialEq, Ord, Eq, Hash)]
5#[cfg_attr(feature = "serde1", derive(serde::Serialize, serde::Deserialize))]
6pub enum Kind {
7 IncludeReachable,
10 ExcludeReachable,
12 RangeBetween,
14 ReachableToMergeBase,
16 IncludeReachableFromParents,
18 ExcludeReachableFromParents,
20}
21
22impl Default for Kind {
23 fn default() -> Self {
24 Kind::IncludeReachable
25 }
26}
27
28impl Spec {
29 pub fn kind(&self) -> Kind {
31 match self {
32 Spec::Include(_) => Kind::IncludeReachable,
33 Spec::Exclude(_) => Kind::ExcludeReachable,
34 Spec::Range { .. } => Kind::RangeBetween,
35 Spec::Merge { .. } => Kind::ReachableToMergeBase,
36 Spec::IncludeOnlyParents { .. } => Kind::IncludeReachableFromParents,
37 Spec::ExcludeParents { .. } => Kind::ExcludeReachableFromParents,
38 }
39 }
40}
41
42mod _impls {
43 use std::fmt::{Display, Formatter};
44
45 use crate::Spec;
46
47 impl Display for Spec {
48 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
49 match self {
50 Spec::Include(oid) => Display::fmt(oid, f),
51 Spec::Exclude(oid) => write!(f, "^{oid}"),
52 Spec::Range { from, to } => write!(f, "{from}..{to}"),
53 Spec::Merge { theirs, ours } => write!(f, "{theirs}...{ours}"),
54 Spec::IncludeOnlyParents(from_exclusive) => write!(f, "{from_exclusive}^@"),
55 Spec::ExcludeParents(oid) => write!(f, "{oid}^!"),
56 }
57 }
58 }
59}
60
61pub mod parse;
63pub use parse::function::parse;