handle Code::multiline_continue_from result

This commit is contained in:
yggverse 2024-12-02 15:12:26 +02:00
parent 7f6c459065
commit 8c00d4bf89
6 changed files with 50 additions and 8 deletions

View file

@ -54,9 +54,9 @@ match Code::inline_from("```inline```") {
``` rust ``` rust
match Code::multiline_begin_from("```alt") { match Code::multiline_begin_from("```alt") {
Some(mut multiline) => { Some(mut multiline) => {
Code::multiline_continue_from(&mut multiline, "line 1"); assert!(Code::multiline_continue_from(&mut multiline, "line 1").is_ok());
Code::multiline_continue_from(&mut multiline, "line 2"); assert!(Code::multiline_continue_from(&mut multiline, "line 2").is_ok());
Code::multiline_continue_from(&mut multiline, "```"); // complete assert!(Code::multiline_continue_from(&mut multiline, "```").is_ok()); // complete
assert!(multiline.completed); assert!(multiline.completed);
assert_eq!(multiline.alt, Some("alt".into())); assert_eq!(multiline.alt, Some("alt".into()));

View file

@ -1,6 +1,8 @@
pub mod error;
pub mod inline; pub mod inline;
pub mod multiline; pub mod multiline;
pub use error::Error;
use inline::Inline; use inline::Inline;
use multiline::Multiline; use multiline::Multiline;
@ -19,7 +21,10 @@ impl Code {
Multiline::begin_from(line) Multiline::begin_from(line)
} }
pub fn multiline_continue_from(this: &mut Multiline, line: &str) { pub fn multiline_continue_from(this: &mut Multiline, line: &str) -> Result<(), Error> {
Multiline::continue_from(this, line) match Multiline::continue_from(this, line) {
Ok(()) => Ok(()),
Err(e) => Err(Error::Multiline(e)),
}
} }
} }

16
src/line/code/error.rs Normal file
View file

@ -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}")
}
}
}
}

View file

@ -1,3 +1,6 @@
pub mod error;
pub use error::Error;
use glib::GString; use glib::GString;
pub struct Multiline { pub struct Multiline {
@ -28,10 +31,10 @@ impl Multiline {
/// Continue preformatted buffer from line, /// Continue preformatted buffer from line,
/// set `completed` as True on close tag found /// 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 // Make sure buffer not completed yet
if self.completed { if self.completed {
panic!("Could not continue as completed") // @TODO handle return Err(Error::Completed);
} }
// Line contain close tag // Line contain close tag
@ -42,5 +45,7 @@ impl Multiline {
// Append data to the buffer, trim close tag on exists // Append data to the buffer, trim close tag on exists
self.buffer self.buffer
.push(GString::from(line.trim_end_matches("```"))); .push(GString::from(line.trim_end_matches("```")));
Ok(())
} }
} }

View file

@ -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!")
}
}
}
}

View file

@ -50,7 +50,7 @@ fn gemtext() {
} }
} }
Some(ref mut result) => { Some(ref mut result) => {
Code::multiline_continue_from(result, line); assert!(Code::multiline_continue_from(result, line).is_ok());
if result.completed { if result.completed {
code_multiline.push(code_multiline_buffer.take().unwrap()); code_multiline.push(code_multiline_buffer.take().unwrap());
code_multiline_buffer = None; code_multiline_buffer = None;