ftw/
ftw_tag.rs

1use crate::traits::ToGitTag;
2use crate::type_alias::GitTag;
3
4use std::fmt;
5use std::fmt::{Display, Formatter};
6use std::str::FromStr;
7
8#[derive(Debug, Eq, PartialEq)]
9pub enum FtwTag {
10    Latest,
11    Tagged { git_tag: GitTag },
12}
13
14const DEFAULT_TEMPLATE_TAG: &str = "v1.5.0";
15
16impl FromStr for FtwTag {
17    type Err = ();
18    fn from_str(s: &str) -> Result<Self, Self::Err> {
19        match s {
20            "latest" => Ok(FtwTag::default()),
21            git_tag => Ok(FtwTag::Tagged {
22                git_tag: git_tag.to_string(),
23            }),
24        }
25    }
26}
27
28impl ToGitTag for FtwTag {
29    fn to_git_tag(&self) -> GitTag {
30        match self {
31            FtwTag::Latest {} => DEFAULT_TEMPLATE_TAG,
32            FtwTag::Tagged { git_tag } => git_tag,
33        }
34        .to_string()
35    }
36}
37
38impl Display for FtwTag {
39    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
40        let message = match self {
41            FtwTag::Latest {} => DEFAULT_TEMPLATE_TAG,
42            FtwTag::Tagged { git_tag } => git_tag,
43        };
44        write!(f, "{message}")
45    }
46}
47
48impl Default for FtwTag {
49    fn default() -> Self {
50        FtwTag::Latest {}
51    }
52}
53
54#[cfg(test)]
55mod ftw_tag_tests {
56    use super::*;
57
58    #[test]
59    fn test_from_str() -> Result<(), ()> {
60        assert_eq!(FtwTag::Latest {}, "latest".parse()?);
61        assert_eq!(
62            FtwTag::Tagged {
63                git_tag: String::from("v1.1.0")
64            },
65            "v1.1.0".parse()?
66        );
67        Ok(())
68    }
69
70    #[test]
71    fn test_to_git_tag() {
72        assert_eq!(FtwTag::Latest.to_git_tag(), "v1.5.0");
73        assert_eq!(
74            FtwTag::Tagged {
75                git_tag: String::from("v1.1.0")
76            }
77            .to_git_tag(),
78            "v1.1.0"
79        );
80    }
81
82    #[test]
83    fn test_fmt() {
84        let latest = FtwTag::Latest;
85        let git_tag = String::from("v1.1.0");
86        let tagged = FtwTag::Tagged { git_tag };
87        assert_eq!(format!("{latest}"), "v1.5.0");
88        assert_eq!(format!("{tagged}"), "v1.1.0");
89    }
90
91    #[test]
92    fn test_default() {
93        assert_eq!(FtwTag::default(), FtwTag::Latest);
94    }
95}