use super::{
api::{Api, ApiAnalysis, ApiDetail},
convert_error::{ConvertErrorWithContext, ErrorContext},
ConvertError,
};
use crate::types::{Namespace, QualifiedName};
use std::collections::HashSet;
pub(crate) fn report_any_error<F, T>(ns: &Namespace, apis: &mut Vec<Api<impl ApiAnalysis>>, fun: F)
where
F: FnOnce() -> Result<T, ConvertErrorWithContext>,
{
match fun() {
Ok(_) => {}
Err(ConvertErrorWithContext(err, None)) => {
eprintln!("Ignored item: {}", err)
}
Err(ConvertErrorWithContext(err, Some(ctx))) => {
eprintln!("Ignored item {}: {}", ctx.to_string(), err);
push_ignored_item(ns, ctx, err, apis)
}
}
}
pub(crate) fn add_api_or_report_error<F, A>(tn: QualifiedName, apis: &mut Vec<Api<A>>, fun: F)
where
F: FnOnce() -> Result<Option<Api<A>>, ConvertErrorWithContext>,
A: ApiAnalysis,
{
match fun() {
Ok(Some(api)) => {
apis.push(api);
}
Ok(None) => {}
Err(ConvertErrorWithContext(err, None)) => {
eprintln!("Ignored {}: {}", tn.to_string(), err);
}
Err(ConvertErrorWithContext(err, Some(ctx))) => {
eprintln!("Ignored {}: {}", tn.to_string(), err);
push_ignored_item(tn.get_namespace(), ctx, err, apis);
}
}
}
fn push_ignored_item(
ns: &Namespace,
ctx: ErrorContext,
err: ConvertError,
apis: &mut Vec<Api<impl ApiAnalysis>>,
) {
apis.push(Api {
name: QualifiedName::new(ns, ctx.get_id().clone()),
deps: HashSet::new(),
detail: ApiDetail::IgnoredItem { err, ctx },
});
}