tamer: pipeline::load_xmlo: Accept reporter

This makes the API of `load_xmlo` much closer to `parse_package_xml`, both
accepting a reporter and distinguishing between recoverable and
unrecoverable errors.

The linker still does not use a reporter and still fails on the first
error, as before; I wanted to keep this change small.

DEV-13162
main
Mike Gerwitz 2023-05-31 15:00:47 -04:00
parent 896fb3a0e5
commit b5187de5dc
3 changed files with 20 additions and 17 deletions

View File

@ -119,10 +119,10 @@ fn compile<R: Reporter>(
let mut ebuf = String::new(); let mut ebuf = String::new();
let report_err = |e: &RecoverableError| { let report_err = |e: RecoverableError| {
// See below note about buffering. // See below note about buffering.
ebuf.clear(); ebuf.clear();
writeln!(ebuf, "{}", reporter.render(e))?; writeln!(ebuf, "{}", reporter.render(&e))?;
println!("{ebuf}"); println!("{ebuf}");
Ok::<_, UnrecoverableError>(()) Ok::<_, UnrecoverableError>(())

View File

@ -106,7 +106,7 @@ fn load_xmlo<P: AsRef<Path>, S: Escaper>(
let src = &mut lowerable(XmlXirReader::new(file, escaper, ctx)); let src = &mut lowerable(XmlXirReader::new(file, escaper, ctx));
let (mut air_ctx, mut state) = let (mut air_ctx, mut state) =
pipeline::load_xmlo::<TameldError>(src, air_ctx, state)?; pipeline::load_xmlo::<TameldError, _>(src, air_ctx, state, Err)?;
let mut dir = path; let mut dir = path;
dir.pop(); dir.pop();

View File

@ -73,26 +73,27 @@ use crate::{
/// TODO: To re-use this in `tamec` we want to be able to ignore fragments. /// TODO: To re-use this in `tamec` we want to be able to ignore fragments.
/// ///
/// TODO: More documentation once this has been further cleaned up. /// TODO: More documentation once this has been further cleaned up.
pub fn load_xmlo<EU: Diagnostic + PartialEq>( pub fn load_xmlo<ER: Diagnostic, EU: Diagnostic>(
src: impl LowerSource<UnknownToken, XirToken, XirError>, src: impl LowerSource<UnknownToken, XirToken, XirError>,
air_ctx: AirAggregateCtx, air_ctx: AirAggregateCtx,
xmlo_ctx: XmloAirContext, xmlo_ctx: XmloAirContext,
mut report_err: impl FnMut(ER) -> Result<(), EU>,
) -> Result<(AirAggregateCtx, XmloAirContext), EU> ) -> Result<(AirAggregateCtx, XmloAirContext), EU>
where where
EU: From<ParseError<UnknownToken, XirError>> ER: From<ParseError<UnknownToken, XirError>>
+ FromParseError<PartialXirToXirf<4, Text>> + FromParseError<PartialXirToXirf<4, Text>>
+ FromParseError<XmloReader> + FromParseError<XmloReader>
+ FromParseError<XmloToAir> + FromParseError<XmloToAir>
+ FromParseError<AirAggregate> + FromParseError<AirAggregate>,
+ From<FinalizeError>, EU: From<FinalizeError>,
{ {
// TODO: This entire block is a WIP and will be incrementally // TODO: This entire block is a WIP and will be incrementally
// abstracted away. // abstracted away.
Lower::< Lower::<
ParsedObject<UnknownToken, XirToken, XirError>, ParsedObject<UnknownToken, XirToken, XirError>,
PartialXirToXirf<4, Text>, PartialXirToXirf<4, Text>,
EU, _,
>::lower(&mut src.map(|result| result.map_err(EU::from)), |toks| { >::lower(&mut src.map(|result| result.map_err(ER::from)), |toks| {
Lower::<PartialXirToXirf<4, Text>, XmloReader, _>::lower(toks, |xmlo| { Lower::<PartialXirToXirf<4, Text>, XmloReader, _>::lower(toks, |xmlo| {
let mut iter = xmlo.scan(false, |st, rtok| match st { let mut iter = xmlo.scan(false, |st, rtok| match st {
true => None, true => None,
@ -112,15 +113,17 @@ where
air, air,
air_ctx, air_ctx,
|end| { |end| {
for result in end { end.fold(Ok::<_, EU>(()), |x, result| match result {
let _ = result?; Ok(_) => x,
Err(e) => {
report_err(e)?;
x
} }
})
Ok::<_, EU>(())
}, },
)?; )?;
Ok::<_, EU>(air_ctx) Ok(air_ctx)
}, },
) )
}) })
@ -134,7 +137,7 @@ where
pub fn parse_package_xml<ER: Diagnostic, EU: Diagnostic>( pub fn parse_package_xml<ER: Diagnostic, EU: Diagnostic>(
src: impl LowerSource<UnknownToken, XirToken, XirError>, src: impl LowerSource<UnknownToken, XirToken, XirError>,
air_ctx: AirAggregateCtx, air_ctx: AirAggregateCtx,
mut report_err: impl FnMut(&ER) -> Result<(), EU>, mut report_err: impl FnMut(ER) -> Result<(), EU>,
) -> Result<AirAggregateCtx, EU> ) -> Result<AirAggregateCtx, EU>
where where
ER: From<ParseError<UnknownToken, XirError>> ER: From<ParseError<UnknownToken, XirError>>
@ -160,7 +163,7 @@ where
end.fold(Ok(()), |x, result| match result { end.fold(Ok(()), |x, result| match result {
Ok(_) => x, Ok(_) => x,
Err(e) => { Err(e) => {
report_err(&e)?; report_err(e)?;
x x
} }
}) })