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}