arch_pkg_text/parse/
partial.rs1pub trait PartialParse<Input>: Sized {
3 type Error;
5
6 fn partial_parse(input: Input) -> PartialParseResult<Self, Self::Error>;
10}
11
12pub trait ParseWithIssues<Input, HandleIssue, Error>: Sized {
14 fn parse_with_issues(
18 input: Input,
19 handle_issue: HandleIssue,
20 ) -> PartialParseResult<Self, Error>;
21}
22
23#[derive(Debug, Clone, Copy)]
25pub struct PartialParseResult<Parsed, Error> {
26 parsed: Parsed,
28 error: Option<Error>,
30}
31
32impl<Parsed, Error> PartialParseResult<Parsed, Error> {
33 pub fn new_complete(parsed: Parsed) -> Self {
35 PartialParseResult {
36 parsed,
37 error: None,
38 }
39 }
40
41 pub fn new_partial(parsed: Parsed, error: Error) -> Self {
43 PartialParseResult {
44 parsed,
45 error: Some(error),
46 }
47 }
48
49 pub fn try_into_complete(self) -> Result<Parsed, Error> {
53 match self.error {
54 Some(error) => Err(error),
55 None => Ok(self.parsed),
56 }
57 }
58
59 pub fn into_partial(self) -> (Parsed, Option<Error>) {
61 (self.parsed, self.error)
62 }
63
64 pub fn parsed(&self) -> &'_ Parsed {
66 &self.parsed
67 }
68
69 pub fn error(&self) -> Option<&'_ Error> {
71 self.error.as_ref()
72 }
73
74 pub fn has_error(&self) -> bool {
76 self.error.is_some()
77 }
78}
79
80impl<Parsed, Error> From<PartialParseResult<Parsed, Error>> for Result<Parsed, Error> {
81 fn from(value: PartialParseResult<Parsed, Error>) -> Self {
82 value.try_into_complete()
83 }
84}
85
86impl<Parsed, Error> From<PartialParseResult<Parsed, Error>> for (Parsed, Option<Error>) {
87 fn from(value: PartialParseResult<Parsed, Error>) -> Self {
88 value.into_partial()
89 }
90}
91
92impl<Parsed, Error> From<(Parsed, Option<Error>)> for PartialParseResult<Parsed, Error> {
93 fn from((parsed, error): (Parsed, Option<Error>)) -> Self {
94 PartialParseResult { parsed, error }
95 }
96}