mirror of
https://github.com/TxtDot/dalet-rs.git
synced 2024-11-05 17:33:58 +03:00
fix: errors
This commit is contained in:
parent
50f5c7fe19
commit
ebc47a2c27
2 changed files with 58 additions and 20 deletions
|
@ -1,5 +1,5 @@
|
|||
use ariadne::{Color, Label, Report, ReportKind, Source};
|
||||
use chumsky::{input::Input, Parser};
|
||||
use chumsky::{error::RichReason, input::Input, Parser};
|
||||
use dalet::daleth::{lexer::lexer, parser::parser};
|
||||
|
||||
fn main() {
|
||||
|
@ -12,16 +12,19 @@ fn main() {
|
|||
match parsed.into_result() {
|
||||
Ok(t) => {
|
||||
println!("{:#?}", t);
|
||||
// println!("{}", format(&t));
|
||||
}
|
||||
Err(e) => e.into_iter().for_each(|e| {
|
||||
// println!("{:#}", )
|
||||
let msg = match e.reason() {
|
||||
RichReason::Many(errs) => errs[0].to_string(),
|
||||
_ => e.to_string(),
|
||||
};
|
||||
|
||||
Report::build(ReportKind::Error, src_file, e.span().start)
|
||||
.with_code("Parser")
|
||||
.with_message(e.to_string())
|
||||
.with_label(
|
||||
Label::new((src_file, e.span().into_range()))
|
||||
.with_message(e.to_string())
|
||||
.with_message(&msg)
|
||||
.with_color(Color::Red),
|
||||
)
|
||||
.finish()
|
||||
|
|
|
@ -26,44 +26,78 @@ pub fn tag<'tokens, 'src: 'tokens>(
|
|||
.clone()
|
||||
.repeated()
|
||||
.collect()
|
||||
.delimited_by(just(Token::LSquare), just(Token::RSquare));
|
||||
.delimited_by(just(Token::LSquare), just(Token::RSquare))
|
||||
.labelled("Tags body");
|
||||
|
||||
let text_body = select! {
|
||||
Token::TextBody(t) => t.to_owned(),
|
||||
Token::MLText(t) => trim_indent(t).to_owned(),
|
||||
Token::MLMSText(n, t) => set_spaces(t, n).to_owned(),
|
||||
Token::MLRText(t) => t.to_owned()
|
||||
};
|
||||
}
|
||||
.labelled("Text body");
|
||||
|
||||
let nnbody = text_body
|
||||
.map(NNBody::Text)
|
||||
.or(tags_body.clone().map(NNBody::Tags));
|
||||
.or(tags_body.clone().map(NNBody::Tags))
|
||||
.labelled("Not null body");
|
||||
|
||||
let body = text_body
|
||||
.map(Body::Text)
|
||||
.or(tags_body.clone().map(Body::Tags))
|
||||
.or_not()
|
||||
.to(Body::Null);
|
||||
.to(Body::Null)
|
||||
.labelled("Body");
|
||||
|
||||
let num_arg = select! {
|
||||
Token::NumberArgument(n) => n
|
||||
};
|
||||
}
|
||||
.labelled("Number argument");
|
||||
|
||||
let text_arg = select! {
|
||||
Token::TextArgument(t) => t.to_owned()
|
||||
};
|
||||
}
|
||||
.labelled("Text argument");
|
||||
|
||||
let nnarg = text_arg.map(NNArg::Text).or(num_arg.map(NNArg::Number));
|
||||
let nnarg = text_arg
|
||||
.map(NNArg::Text)
|
||||
.or(num_arg.map(NNArg::Number))
|
||||
.labelled("Not null argument");
|
||||
let tnullarg = text_arg
|
||||
.map(TNullArg::Text)
|
||||
.or_not()
|
||||
.map(|v| v.unwrap_or(TNullArg::Null));
|
||||
let hlarg = num_arg.try_map(|n, s| Hl::try_from(n).map_err(|e| Rich::custom(s, e)));
|
||||
let alignarg = choice((
|
||||
just(Token::TextArgument("start")).to(AlignArg::Start),
|
||||
just(Token::TextArgument("center")).to(AlignArg::Start),
|
||||
just(Token::TextArgument("end")).to(AlignArg::Start),
|
||||
));
|
||||
.map(|v| v.unwrap_or(TNullArg::Null))
|
||||
.labelled("Text or null argument");
|
||||
|
||||
let hlarg = num_arg
|
||||
.validate(|n, e, emmiter| match Hl::try_from(n) {
|
||||
Ok(l) => l,
|
||||
Err(_) => {
|
||||
emmiter.emit(Rich::custom(
|
||||
e.span(),
|
||||
"Heading level must be between 1 and 6",
|
||||
));
|
||||
Hl::One
|
||||
}
|
||||
})
|
||||
.labelled("Heading level argument");
|
||||
|
||||
let alignarg = text_arg
|
||||
.clone()
|
||||
.validate(|t, e, emmiter| match t.as_str() {
|
||||
"start" => AlignArg::Start,
|
||||
"center" => AlignArg::Center,
|
||||
"end" => AlignArg::End,
|
||||
|
||||
_ => {
|
||||
emmiter.emit(Rich::custom(
|
||||
e.span(),
|
||||
"Expected 'start', 'center' or 'end'",
|
||||
));
|
||||
AlignArg::Start
|
||||
}
|
||||
})
|
||||
.labelled("Align argument");
|
||||
|
||||
let el = just(Token::El).ignore_then(nnbody.clone()).map(El);
|
||||
let h = just(Token::H)
|
||||
|
@ -140,8 +174,9 @@ pub fn tag<'tokens, 'src: 'tokens>(
|
|||
.map(|v| El(NNBody::Tags(v)));
|
||||
|
||||
let paragraph = select! {
|
||||
Token::Paragraph(t) => P(NNBody::Text(t.replace("\n"," ").trim().to_owned()))
|
||||
};
|
||||
Token::Paragraph(t) => P(NNBody::Text(t.replace("\n", " ").trim().to_owned()))
|
||||
}
|
||||
.labelled("Paragraph");
|
||||
|
||||
choice((
|
||||
el, h, p, br, ul, ol, row, link, navlink, btn, navbtn, img, table, tcol, tpcol, hr, b,
|
||||
|
|
Loading…
Reference in a new issue