mirror of
https://github.com/YGGverse/ggemtext.git
synced 2026-03-31 17:15:33 +00:00
handle Code::multiline_continue_from result
This commit is contained in:
parent
7f6c459065
commit
8c00d4bf89
6 changed files with 50 additions and 8 deletions
|
|
@ -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()));
|
||||
|
|
|
|||
|
|
@ -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)),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
16
src/line/code/error.rs
Normal file
16
src/line/code/error.rs
Normal 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}")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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(())
|
||||
}
|
||||
}
|
||||
|
|
|
|||
16
src/line/code/multiline/error.rs
Normal file
16
src/line/code/multiline/error.rs
Normal 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!")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue