Fix bug with line endings
This commit is contained in:
parent
e8a553170b
commit
6001224339
48
src/lib.rs
48
src/lib.rs
|
@ -35,7 +35,7 @@
|
|||
//! You can parse IRC messages using the provided `parse` function.
|
||||
//!
|
||||
//! ```
|
||||
//! let msg = "@id=123;name=rick :nick!user@host.tmi.twitch.tv PRIVMSG #rickastley :Never gonna give you up!";
|
||||
//! let msg = "@id=123;name=rick :nick!user@host.tmi.twitch.tv PRIVMSG #rickastley :Never gonna give you up!\r\n";
|
||||
//! match ircparser::parse(msg) {
|
||||
//! Ok(mut x) => {
|
||||
//! let line = x.pop_front().unwrap();
|
||||
|
@ -81,6 +81,7 @@ impl ParseError {
|
|||
///
|
||||
/// assert_eq!(e.details, "err".to_string())
|
||||
/// ```
|
||||
///
|
||||
pub fn new(details: &str) -> Self {
|
||||
Self {
|
||||
details: details.into(),
|
||||
|
@ -112,11 +113,12 @@ fn find_index(text: &str, char: char, start: usize) -> Option<usize> {
|
|||
/// will be a separate element in the return value.
|
||||
///
|
||||
/// # Returns
|
||||
/// - [`VecDeque<Line>`] - A [`VecDeque`] of all parsed [`Line`]s.
|
||||
/// - [`VecDeque<Line>`] - A [`VecDeque`] of all parsed [`Line`]s. This
|
||||
/// will be empty if no valid lines were passed and no errors occur.
|
||||
///
|
||||
/// # Example
|
||||
/// ```
|
||||
/// let msg = "@id=123;name=rick :nick!user@host.tmi.twitch.tv PRIVMSG #rickastley :Never gonna give you up!";
|
||||
/// let msg = "@id=123;name=rick :nick!user@host.tmi.twitch.tv PRIVMSG #rickastley :Never gonna give you up!\r\n";
|
||||
///
|
||||
/// match ircparser::parse(msg) {
|
||||
/// Ok(mut x) => {
|
||||
|
@ -141,12 +143,16 @@ fn find_index(text: &str, char: char, start: usize) -> Option<usize> {
|
|||
/// The behaviour of this function changed in v0.2.0. It can now accept
|
||||
/// multiple lines at once, but as a consequence, now returns a
|
||||
/// [`VecDeque`] of [`Line`] objects instead of a single [`Line`].
|
||||
///
|
||||
pub fn parse(text: &str) -> ParseResult<VecDeque<Line>> {
|
||||
let mut parsed_lines: VecDeque<Line> = VecDeque::new();
|
||||
|
||||
for line in text.replace('\r', "").split('\n') {
|
||||
for line in text.split("\r\n") {
|
||||
if line.is_empty() {
|
||||
return Err(ParseError::new("line length cannot be 0"));
|
||||
// If the line length is 0, we can assume the previous line
|
||||
// ended in \r\n, and that this line doesn't need to be
|
||||
// processed.
|
||||
continue;
|
||||
}
|
||||
|
||||
let mut idx = 0;
|
||||
|
@ -202,9 +208,11 @@ mod test_lib {
|
|||
|
||||
#[test]
|
||||
fn test_single_partial() {
|
||||
let msg = "PRIVMSG #rickastley :Never gonna give you up!";
|
||||
let msg = "PRIVMSG #rickastley :Never gonna give you up!\r\n";
|
||||
|
||||
match parse(msg) {
|
||||
Ok(mut x) => {
|
||||
assert_eq!(x.len(), 1);
|
||||
let line = x.pop_front().unwrap();
|
||||
|
||||
assert_eq!(line.tags, HashMap::new());
|
||||
|
@ -214,16 +222,17 @@ mod test_lib {
|
|||
}
|
||||
Err(e) => {
|
||||
println!("A parsing error occured: {e}");
|
||||
return;
|
||||
assert!(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_single_full() {
|
||||
let msg = "@id=123;name=rick :nick!user@host.tmi.twitch.tv PRIVMSG #rickastley :Never gonna give you up!";
|
||||
let msg = "@id=123;name=rick :nick!user@host.tmi.twitch.tv PRIVMSG #rickastley :Never gonna give you up!\r\n";
|
||||
match parse(msg) {
|
||||
Ok(mut x) => {
|
||||
assert_eq!(x.len(), 1);
|
||||
let line = x.pop_front().unwrap();
|
||||
|
||||
assert_eq!(
|
||||
|
@ -249,9 +258,11 @@ mod test_lib {
|
|||
|
||||
#[test]
|
||||
fn test_readme_example() {
|
||||
let msg = "@id=123;name=rick :nick!user@host.tmi.twitch.tv PRIVMSG #rickastley :Never gonna give you up!";
|
||||
let msg = "@id=123;name=rick :nick!user@host.tmi.twitch.tv PRIVMSG #rickastley :Never gonna give you up!\r\n";
|
||||
match parse(msg) {
|
||||
Ok(mut x) => {
|
||||
println!("{x:?}");
|
||||
assert_eq!(x.len(), 1);
|
||||
let line = x.pop_front().unwrap();
|
||||
|
||||
assert_eq!(&line.tags["id"], "123");
|
||||
|
@ -264,14 +275,27 @@ mod test_lib {
|
|||
}
|
||||
Err(e) => {
|
||||
println!("A parsing error occured: {e}");
|
||||
return;
|
||||
assert!(false);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_empty() {
|
||||
match parse("") {
|
||||
Ok(x) => {
|
||||
assert_eq!(x.len(), 0);
|
||||
}
|
||||
Err(e) => {
|
||||
println!("A parsing error occured: {e}");
|
||||
assert!(false);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_multiline() {
|
||||
let msg = "@id=123 PRIVMSG #rickastley :Never gonna give you up!\n@id=456 PRIVMSG #rickastley :Never gonna let you down!";
|
||||
let msg = "@id=123 PRIVMSG #rickastley :Never gonna give you up!\r\n@id=456 PRIVMSG #rickastley :Never gonna let you down!\r\n";
|
||||
match parse(msg) {
|
||||
Ok(mut x) => {
|
||||
assert_eq!(x.len(), 2);
|
||||
|
@ -287,7 +311,7 @@ mod test_lib {
|
|||
}
|
||||
Err(e) => {
|
||||
println!("A parsing error occured: {e}");
|
||||
return;
|
||||
assert!(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -36,11 +36,14 @@ pub struct Line {
|
|||
/// This line's tags. This will be an empty hashmap if there are
|
||||
/// none.
|
||||
pub tags: HashMap<String, String>,
|
||||
|
||||
/// This line's source (including the nick, user, and host). This is
|
||||
/// optional, and will be [`None`] if not provided.
|
||||
pub source: Option<String>,
|
||||
|
||||
/// This line's command.
|
||||
pub command: String,
|
||||
|
||||
/// Any parameters passed to the command. This will be an empty
|
||||
/// vector if there are none.
|
||||
pub params: Vec<String>,
|
||||
|
@ -78,6 +81,7 @@ impl Line {
|
|||
/// assert_eq!(line.command, "PRIVMSG");
|
||||
/// assert_eq!(line.params[0], "#rickastley");
|
||||
/// ```
|
||||
///
|
||||
pub fn new(
|
||||
tags: HashMap<String, String>,
|
||||
source: Option<String>,
|
||||
|
|
Loading…
Reference in a new issue