socketry_markdown/util/
line_ending.rs1use alloc::{str::FromStr, string::String};
7
8#[derive(Clone, Debug, Default, Eq, PartialEq)]
24#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
25pub enum LineEnding {
26 #[cfg_attr(feature = "serde", serde(rename = "\r\n"))]
35 CarriageReturnLineFeed,
36 #[cfg_attr(feature = "serde", serde(rename = "\r"))]
45 CarriageReturn,
46 #[default]
55 #[cfg_attr(feature = "serde", serde(rename = "\n"))]
56 LineFeed,
57}
58
59impl LineEnding {
61 #[must_use]
63 pub fn as_str(&self) -> &str {
64 match self {
65 LineEnding::CarriageReturnLineFeed => "\r\n",
66 LineEnding::CarriageReturn => "\r",
67 LineEnding::LineFeed => "\n",
68 }
69 }
70}
71
72impl FromStr for LineEnding {
73 type Err = String;
74
75 fn from_str(s: &str) -> Result<Self, Self::Err> {
81 match s {
82 "\r\n" => Ok(LineEnding::CarriageReturnLineFeed),
83 "\r" => Ok(LineEnding::CarriageReturn),
84 "\n" => Ok(LineEnding::LineFeed),
85 _ => Err("Expected CR, LF, or CRLF".into()),
86 }
87 }
88}
89
90#[cfg(test)]
91mod tests {
92 use super::*;
93
94 #[test]
95 fn test_line_ending() {
96 assert_eq!(
97 "\r".parse(),
98 Ok(LineEnding::CarriageReturn),
99 "should support turning a string into a carriage return"
100 );
101 assert_eq!(
102 LineEnding::CarriageReturn.as_str(),
103 "\r",
104 "should support turning a carriage return into a string"
105 );
106
107 assert_eq!(
108 "\n".parse(),
109 Ok(LineEnding::LineFeed),
110 "should support turning a string into a line feed"
111 );
112 assert_eq!(
113 LineEnding::LineFeed.as_str(),
114 "\n",
115 "should support turning a line feed into a string"
116 );
117
118 assert_eq!(
119 "\r\n".parse(),
120 Ok(LineEnding::CarriageReturnLineFeed),
121 "should support turning a string into a carriage return + line feed"
122 );
123 assert_eq!(
124 LineEnding::CarriageReturnLineFeed.as_str(),
125 "\r\n",
126 "should support turning a carriage return + line feed into a string"
127 );
128
129 assert_eq!(
130 "aaa".parse::<LineEnding>(),
131 Err("Expected CR, LF, or CRLF".into()),
132 "should error when parsing a non-eol"
133 );
134 }
135}