Skip to content

Commit a641995

Browse files
committed
refactor(parser): refactor try_parse to be lift more weight
1 parent 5eb9442 commit a641995

File tree

5 files changed

+29
-39
lines changed

5 files changed

+29
-39
lines changed

src/document.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
use miette::SourceSpan;
33
use std::fmt::Display;
44

5-
use crate::{KdlNode, KdlValue};
5+
use crate::{KdlNode, KdlParseFailure, KdlValue};
66

77
/// Represents a KDL
88
/// [`Document`](https://github.com/kdl-org/kdl/blob/main/SPEC.md#document).
@@ -311,6 +311,14 @@ impl KdlDocument {
311311
// }
312312
}
313313

314+
impl std::str::FromStr for KdlDocument {
315+
type Err = KdlParseFailure;
316+
317+
fn from_str(s: &str) -> Result<Self, Self::Err> {
318+
crate::v2_parser::try_parse(crate::v2_parser::document, s)
319+
}
320+
}
321+
314322
impl Display for KdlDocument {
315323
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
316324
self.stringify(f, 0)

src/entry.rs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -239,12 +239,7 @@ impl FromStr for KdlEntry {
239239
type Err = KdlParseFailure;
240240

241241
fn from_str(s: &str) -> Result<Self, Self::Err> {
242-
let (maybe_val, errs) = v2_parser::try_parse(v2_parser::padded_node_entry, s);
243-
if let (Some(Some(v)), true) = (maybe_val, errs.is_empty()) {
244-
Ok(v)
245-
} else {
246-
Err(v2_parser::failure_from_errs(errs, s))
247-
}
242+
v2_parser::try_parse(v2_parser::padded_node_entry, s)
248243
}
249244
}
250245

src/identifier.rs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -131,12 +131,7 @@ impl FromStr for KdlIdentifier {
131131
type Err = KdlParseFailure;
132132

133133
fn from_str(s: &str) -> Result<Self, Self::Err> {
134-
let (maybe_val, errs) = v2_parser::try_parse(v2_parser::identifier, s);
135-
if let Some(v) = maybe_val {
136-
Ok(v)
137-
} else {
138-
Err(v2_parser::failure_from_errs(errs, s))
139-
}
134+
v2_parser::try_parse(v2_parser::identifier, s)
140135
}
141136
}
142137

src/node.rs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -501,12 +501,7 @@ impl FromStr for KdlNode {
501501
type Err = KdlParseFailure;
502502

503503
fn from_str(input: &str) -> Result<Self, Self::Err> {
504-
let (maybe_val, errs) = v2_parser::try_parse(v2_parser::padded_node, input);
505-
if let (Some(v), true) = (maybe_val, errs.is_empty()) {
506-
Ok(v)
507-
} else {
508-
Err(v2_parser::failure_from_errs(errs, input))
509-
}
504+
v2_parser::try_parse(v2_parser::padded_node, input)
510505
}
511506
}
512507

src/v2_parser.rs

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ use miette::{Severity, SourceSpan};
77

88
use winnow::{
99
ascii::{digit1, hex_digit1, oct_digit1, Caseless},
10-
combinator::{alt, cut_err, eof, not, opt, peek, preceded, repeat, repeat_till, terminated},
10+
combinator::{
11+
alt, cut_err, eof, fail, not, opt, peek, preceded, repeat, repeat_till, terminated,
12+
},
1113
error::{
1214
AddContext, ContextError, ErrorKind, FromExternalError, FromRecoverableError, ParserError,
1315
StrContext, StrContextValue,
@@ -26,25 +28,16 @@ use crate::{
2628
type Input<'a> = Recoverable<Located<&'a str>, KdlParseError>;
2729
type PResult<T> = winnow::PResult<T, KdlParseError>;
2830

29-
impl std::str::FromStr for KdlDocument {
30-
type Err = KdlParseFailure;
31-
32-
fn from_str(s: &str) -> Result<Self, Self::Err> {
33-
let (maybe_val, errs) = try_parse(document, s);
34-
if let (Some(v), true) = (maybe_val, errs.is_empty()) {
35-
Ok(v)
36-
} else {
37-
Err(failure_from_errs(errs, s))
38-
}
39-
}
40-
}
41-
4231
pub(crate) fn try_parse<'a, P: Parser<Input<'a>, T, KdlParseError>, T>(
4332
mut parser: P,
4433
input: &'a str,
45-
) -> (Option<T>, Vec<KdlParseError>) {
34+
) -> Result<T, KdlParseFailure> {
4635
let (_, maybe_val, errs) = parser.recoverable_parse(Located::new(input));
47-
(maybe_val, errs)
36+
if let (Some(v), true) = (maybe_val, errs.is_empty()) {
37+
Ok(v)
38+
} else {
39+
Err(failure_from_errs(errs, input))
40+
}
4841
}
4942

5043
pub(crate) fn failure_from_errs(errs: Vec<KdlParseError>, input: &str) -> KdlParseFailure {
@@ -201,7 +194,7 @@ fn new_input(s: &str) -> Input<'_> {
201194
}
202195

203196
/// `document := bom? nodes`
204-
fn document(input: &mut Input<'_>) -> PResult<KdlDocument> {
197+
pub(crate) fn document(input: &mut Input<'_>) -> PResult<KdlDocument> {
205198
let bom = opt(bom.take()).parse_next(input)?;
206199
let mut doc = nodes.parse_next(input)?;
207200
if let Some(bom) = bom {
@@ -373,7 +366,7 @@ fn final_node(input: &mut Input<'_>) -> PResult<KdlNode> {
373366
Ok(node)
374367
}
375368

376-
pub(crate) fn padded_node_entry(input: &mut Input<'_>) -> PResult<Option<KdlEntry>> {
369+
pub(crate) fn padded_node_entry(input: &mut Input<'_>) -> PResult<KdlEntry> {
377370
let ((leading, entry, trailing), _span) = (
378371
repeat(0.., line_space).map(|_: ()| ()).take(),
379372
node_entry,
@@ -383,7 +376,7 @@ pub(crate) fn padded_node_entry(input: &mut Input<'_>) -> PResult<Option<KdlEntr
383376
)
384377
.with_span()
385378
.parse_next(input)?;
386-
Ok(entry.map(|mut val| {
379+
if let Some(entry) = entry.map(|mut val| {
387380
if let Some(fmt) = val.format_mut() {
388381
fmt.leading = format!("{leading}{}", fmt.leading);
389382
fmt.trailing = format!("{}{trailing}", fmt.trailing);
@@ -393,7 +386,11 @@ pub(crate) fn padded_node_entry(input: &mut Input<'_>) -> PResult<Option<KdlEntr
393386
val.span = _span.into();
394387
}
395388
val
396-
}))
389+
}) {
390+
Ok(entry)
391+
} else {
392+
fail.parse_next(input)?
393+
}
397394
}
398395

399396
/// `node-prop-or-arg := prop | value`

0 commit comments

Comments
 (0)