Markdown parser fork with extended syntax for personal use.
at hack 130 lines 3.3 kB view raw
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}