Skip to main content

tweep/issues/
warning_type.rs

1/// An enum of the types of warnings that can be produced by `tweep`
2#[derive(Clone, Debug, Eq, PartialEq)]
3pub enum WarningKind {
4    /// `\[` in a passage title
5    EscapedOpenSquare,
6
7    /// `\]` in a passage title
8    EscapedCloseSquare,
9
10    /// `\{` in a passage title
11    EscapedOpenCurly,
12
13    /// `\}` in a passage title
14    EscapedCloseCurly,
15
16    /// Error encountered while parsing JSON. Contains the text of the error
17    JsonError(String),
18
19    /// `StoryTitle` passage encountered after parsing a `StoryTitle` passage
20    DuplicateStoryTitle,
21
22    /// `StoryData` passage encountered after parsing a `StoryData` passage
23    DuplicateStoryData,
24
25    /// No `StoryTitle` passage parsed while parsing a [`Story`](struct.Story.html)
26    MissingStoryTitle,
27
28    /// No `StoryData` passage parsed while parsing a [`Story`](struct.Story.html)
29    MissingStoryData,
30
31    /// Encountered a link in a [`TwineContent`](struct.TwineContent.html) passage that was unterminated
32    UnclosedLink,
33
34    /// Encountered errant whitespace in a Twine link (e.g., `[[Text | Link]]`)
35    WhitespaceInLink,
36
37    /// Encountered a link to a passage name that does not match any parsed
38    /// passage. Contains the passage name content of the dead link.
39    DeadLink(String),
40
41    /// No passage called `Start` found and no start passage set in `StoryData`
42    MissingStartPassage,
43
44    /// Start passage set in `StoryData` that cannot be found
45    DeadStartPassage(String),
46
47    /// Encountered a duplicated passage name
48    DuplicatePassage(String),
49}
50
51#[cfg(feature = "issue-names")]
52impl WarningKind {
53    /// Gets a string representation of a `WarningKind` variant's name
54    ///
55    /// Enabled with "issue-names" feature
56    pub fn get_name(&self) -> &str {
57        match self {
58            WarningKind::EscapedOpenSquare => "EscapedOpenSquare",
59            WarningKind::EscapedCloseSquare => "EscapedCloseSquare",
60            WarningKind::EscapedOpenCurly => "EscapedOpenCurly",
61            WarningKind::EscapedCloseCurly => "EscapedCloseCurly",
62            WarningKind::JsonError(_) => "JsonError",
63            WarningKind::DuplicateStoryData => "DuplicateStoryData",
64            WarningKind::DuplicateStoryTitle => "DuplicateStoryTitle",
65            WarningKind::MissingStoryData => "MissingStoryData",
66            WarningKind::MissingStoryTitle => "MissingStoryTitle",
67            WarningKind::UnclosedLink => "UnclosedLink",
68            WarningKind::WhitespaceInLink => "WhitespaceInLink",
69            WarningKind::DeadLink(_) => "DeadLink",
70            WarningKind::MissingStartPassage => "MissingStartPassage",
71            WarningKind::DeadStartPassage(_) => "DeadStartPassage",
72            WarningKind::DuplicatePassage(_) => "DuplicatePassage",
73        }
74    }
75}
76
77impl std::fmt::Display for WarningKind {
78    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
79        write!(
80            f,
81            "{}",
82            match self {
83                WarningKind::EscapedOpenSquare =>
84                    "Escaped [ character in passage header".to_string(),
85                WarningKind::EscapedCloseSquare =>
86                    "Escaped ] character in passage header".to_string(),
87                WarningKind::EscapedOpenCurly =>
88                    "Escaped { character in passage header".to_string(),
89                WarningKind::EscapedCloseCurly =>
90                    "Escaped } character in passage header".to_string(),
91                WarningKind::JsonError(error_str) =>
92                    format!("Error encountered while parsing JSON: {}", error_str),
93                WarningKind::DuplicateStoryData => "Multiple StoryData passages found".to_string(),
94                WarningKind::DuplicateStoryTitle =>
95                    "Multiple StoryTitle passages found".to_string(),
96                WarningKind::MissingStoryData => "No StoryData passage found".to_string(),
97                WarningKind::MissingStoryTitle => "No StoryTitle passage found".to_string(),
98                WarningKind::UnclosedLink => "Unclosed passage link".to_string(),
99                WarningKind::WhitespaceInLink => "Whitespace in passage link".to_string(),
100                WarningKind::DeadLink(target) =>
101                    format!("Dead link to nonexistant passage: {}", target),
102                WarningKind::MissingStartPassage =>
103                    "No passage \"Start\" found and no alternate starting passage set in StoryData"
104                        .to_string(),
105                WarningKind::DeadStartPassage(start) =>
106                    format!("Start passage set to {}, but no such passage found", start),
107                WarningKind::DuplicatePassage(name) => format!("Found duplicate passage named {}", name),
108            }
109        )
110    }
111}
112
113#[cfg(all(test, feature = "issue-names"))]
114mod tests {
115    use super::*;
116
117    #[cfg(feature = "issue-names")]
118    #[test]
119    fn test_names() {
120        assert_eq!(WarningKind::EscapedOpenSquare.get_name(), "EscapedOpenSquare");
121        assert_eq!(WarningKind::EscapedCloseSquare.get_name(), "EscapedCloseSquare");
122        assert_eq!(WarningKind::EscapedOpenCurly.get_name(), "EscapedOpenCurly");
123        assert_eq!(WarningKind::EscapedCloseCurly.get_name(), "EscapedCloseCurly");
124        assert_eq!(WarningKind::JsonError("x".to_string()).get_name(), "JsonError");
125        assert_eq!(WarningKind::DuplicateStoryData.get_name(), "DuplicateStoryData");
126        assert_eq!(WarningKind::DuplicateStoryTitle.get_name(), "DuplicateStoryTitle");
127        assert_eq!(WarningKind::MissingStoryData.get_name(), "MissingStoryData");
128        assert_eq!(WarningKind::MissingStoryTitle.get_name(), "MissingStoryTitle");
129        assert_eq!(WarningKind::UnclosedLink.get_name(), "UnclosedLink");
130        assert_eq!(WarningKind::WhitespaceInLink.get_name(), "WhitespaceInLink");
131        assert_eq!(WarningKind::DeadLink("x".to_string()).get_name(), "DeadLink");
132        assert_eq!(WarningKind::MissingStartPassage.get_name(), "MissingStartPassage");
133        assert_eq!(WarningKind::DeadStartPassage("x".to_string()).get_name(), "DeadStartPassage");
134        assert_eq!(WarningKind::DuplicatePassage("x".to_string()).get_name(), "DuplicatePassage");
135    }
136}