Markdown parser fork with extended syntax for personal use.
1use alloc::{str::FromStr, string::String};
2
3/// Type of line endings in markdown.
4///
5/// Particularly when working with Windows, you might want to use
6/// `LineEnding::CarriageReturnLineFeed`.
7///
8/// ## Examples
9///
10/// ```
11/// use markdown::LineEnding;
12/// # fn main() {
13///
14/// // Use a CR + LF combination:
15/// let crlf = LineEnding::CarriageReturnLineFeed;
16/// # }
17/// ```
18#[derive(Clone, Debug, Default, Eq, PartialEq)]
19#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
20pub enum LineEnding {
21 /// Both a carriage return (`\r`) and a line feed (`\n`).
22 ///
23 /// ## Example
24 ///
25 /// ```markdown
26 /// a␍␊
27 /// b
28 /// ```
29 #[cfg_attr(feature = "serde", serde(rename = "\r\n"))]
30 CarriageReturnLineFeed,
31 /// Sole carriage return (`\r`).
32 ///
33 /// ## Example
34 ///
35 /// ```markdown
36 /// a␍
37 /// b
38 /// ```
39 #[cfg_attr(feature = "serde", serde(rename = "\r"))]
40 CarriageReturn,
41 /// Sole line feed (`\n`).
42 ///
43 /// ## Example
44 ///
45 /// ```markdown
46 /// a␊
47 /// b
48 /// ```
49 #[default]
50 #[cfg_attr(feature = "serde", serde(rename = "\n"))]
51 LineFeed,
52}
53
54// xxxxxxxxxxxxxxx
55impl LineEnding {
56 /// Turn the line ending into a [str].
57 #[must_use]
58 pub fn as_str(&self) -> &str {
59 match self {
60 LineEnding::CarriageReturnLineFeed => "\r\n",
61 LineEnding::CarriageReturn => "\r",
62 LineEnding::LineFeed => "\n",
63 }
64 }
65}
66
67impl FromStr for LineEnding {
68 type Err = String;
69
70 /// Turn a string into a line ending.
71 ///
72 /// ## Panics
73 ///
74 /// Panics if `code` is not `\r\n`, `\r`, or `\n`.
75 fn from_str(s: &str) -> Result<Self, Self::Err> {
76 match s {
77 "\r\n" => Ok(LineEnding::CarriageReturnLineFeed),
78 "\r" => Ok(LineEnding::CarriageReturn),
79 "\n" => Ok(LineEnding::LineFeed),
80 _ => Err("Expected CR, LF, or CRLF".into()),
81 }
82 }
83}
84
85#[cfg(test)]
86mod tests {
87 use super::*;
88
89 #[test]
90 fn test_line_ending() {
91 assert_eq!(
92 "\r".parse(),
93 Ok(LineEnding::CarriageReturn),
94 "should support turning a string into a carriage return"
95 );
96 assert_eq!(
97 LineEnding::CarriageReturn.as_str(),
98 "\r",
99 "should support turning a carriage return into a string"
100 );
101
102 assert_eq!(
103 "\n".parse(),
104 Ok(LineEnding::LineFeed),
105 "should support turning a string into a line feed"
106 );
107 assert_eq!(
108 LineEnding::LineFeed.as_str(),
109 "\n",
110 "should support turning a line feed into a string"
111 );
112
113 assert_eq!(
114 "\r\n".parse(),
115 Ok(LineEnding::CarriageReturnLineFeed),
116 "should support turning a string into a carriage return + line feed"
117 );
118 assert_eq!(
119 LineEnding::CarriageReturnLineFeed.as_str(),
120 "\r\n",
121 "should support turning a carriage return + line feed into a string"
122 );
123
124 assert_eq!(
125 "aaa".parse::<LineEnding>(),
126 Err("Expected CR, LF, or CRLF".into()),
127 "should error when parsing a non-eol"
128 );
129 }
130}