diff --git a/README.md b/README.md index dba4c65..0abc77a 100644 --- a/README.md +++ b/README.md @@ -54,9 +54,9 @@ match Code::inline_from("```inline```") { ``` rust match Code::multiline_begin_from("```alt") { Some(mut multiline) => { - Code::multiline_continue_from(&mut multiline, "line 1"); - Code::multiline_continue_from(&mut multiline, "line 2"); - Code::multiline_continue_from(&mut multiline, "```"); // complete + assert!(Code::multiline_continue_from(&mut multiline, "line 1").is_ok()); + assert!(Code::multiline_continue_from(&mut multiline, "line 2").is_ok()); + assert!(Code::multiline_continue_from(&mut multiline, "```").is_ok()); // complete assert!(multiline.completed); assert_eq!(multiline.alt, Some("alt".into())); diff --git a/src/line/code.rs b/src/line/code.rs index f9ab3ee..eb0c4df 100644 --- a/src/line/code.rs +++ b/src/line/code.rs @@ -1,6 +1,8 @@ +pub mod error; pub mod inline; pub mod multiline; +pub use error::Error; use inline::Inline; use multiline::Multiline; @@ -19,7 +21,10 @@ impl Code { Multiline::begin_from(line) } - pub fn multiline_continue_from(this: &mut Multiline, line: &str) { - Multiline::continue_from(this, line) + pub fn multiline_continue_from(this: &mut Multiline, line: &str) -> Result<(), Error> { + match Multiline::continue_from(this, line) { + Ok(()) => Ok(()), + Err(e) => Err(Error::Multiline(e)), + } } } diff --git a/src/line/code/error.rs b/src/line/code/error.rs new file mode 100644 index 0000000..410dfe3 --- /dev/null +++ b/src/line/code/error.rs @@ -0,0 +1,16 @@ +use std::fmt::{Display, Formatter, Result}; + +#[derive(Debug)] +pub enum Error { + Multiline(crate::line::code::multiline::Error), +} + +impl Display for Error { + fn fmt(&self, f: &mut Formatter) -> Result { + match self { + Self::Multiline(e) => { + write!(f, "Multiline error: {e}") + } + } + } +} diff --git a/src/line/code/multiline.rs b/src/line/code/multiline.rs index 0180df1..fe42870 100644 --- a/src/line/code/multiline.rs +++ b/src/line/code/multiline.rs @@ -1,3 +1,6 @@ +pub mod error; +pub use error::Error; + use glib::GString; pub struct Multiline { @@ -28,10 +31,10 @@ impl Multiline { /// Continue preformatted buffer from line, /// set `completed` as True on close tag found - pub fn continue_from(&mut self, line: &str) { + pub fn continue_from(&mut self, line: &str) -> Result<(), Error> { // Make sure buffer not completed yet if self.completed { - panic!("Could not continue as completed") // @TODO handle + return Err(Error::Completed); } // Line contain close tag @@ -42,5 +45,7 @@ impl Multiline { // Append data to the buffer, trim close tag on exists self.buffer .push(GString::from(line.trim_end_matches("```"))); + + Ok(()) } } diff --git a/src/line/code/multiline/error.rs b/src/line/code/multiline/error.rs new file mode 100644 index 0000000..78d0474 --- /dev/null +++ b/src/line/code/multiline/error.rs @@ -0,0 +1,16 @@ +use std::fmt::{Display, Formatter, Result}; + +#[derive(Debug)] +pub enum Error { + Completed, +} + +impl Display for Error { + fn fmt(&self, f: &mut Formatter) -> Result { + match self { + Self::Completed => { + write!(f, "Could not continue as completed!") + } + } + } +} diff --git a/tests/integration.rs b/tests/integration.rs index 5aa2cd9..b41b8ba 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -50,7 +50,7 @@ fn gemtext() { } } Some(ref mut result) => { - Code::multiline_continue_from(result, line); + assert!(Code::multiline_continue_from(result, line).is_ok()); if result.completed { code_multiline.push(code_multiline_buffer.take().unwrap()); code_multiline_buffer = None;