use lean_rs::Obj;
use lean_rs::abi::structure::{ctor_tag, take_ctor_objects};
use lean_rs::abi::traits::{TryFromLean, conversion_error};
use lean_rs::error::LeanResult;
use crate::host::elaboration::LeanElabFailure;
use crate::host::process::info_tree::ProcessedFile;
#[derive(Debug)]
#[non_exhaustive]
pub enum ProcessFileOutcome {
Processed(ProcessedFile),
Unsupported,
}
#[derive(Debug)]
#[non_exhaustive]
pub enum ProcessModuleOutcome {
Ok {
file: ProcessedFile,
imports: Vec<String>,
},
MissingImports {
file: ProcessedFile,
imports: Vec<String>,
missing: Vec<String>,
},
HeaderParseFailed {
diagnostics: LeanElabFailure,
},
Unsupported,
}
impl<'lean> TryFromLean<'lean> for ProcessModuleOutcome {
fn try_from_lean(obj: Obj<'lean>) -> LeanResult<Self> {
let tag = ctor_tag(&obj)?;
match tag {
0 => {
let [file, imports] = take_ctor_objects::<2>(obj, 0, "ProcessModuleOutcome::ok")?;
Ok(Self::Ok {
file: ProcessedFile::try_from_lean(file)?,
imports: Vec::<String>::try_from_lean(imports)?,
})
}
1 => {
let [file, imports, missing] = take_ctor_objects::<3>(obj, 1, "ProcessModuleOutcome::missingImports")?;
Ok(Self::MissingImports {
file: ProcessedFile::try_from_lean(file)?,
imports: Vec::<String>::try_from_lean(imports)?,
missing: Vec::<String>::try_from_lean(missing)?,
})
}
2 => {
let [diagnostics] = take_ctor_objects::<1>(obj, 2, "ProcessModuleOutcome::headerParseFailed")?;
Ok(Self::HeaderParseFailed {
diagnostics: LeanElabFailure::try_from_lean(diagnostics)?,
})
}
other => Err(conversion_error(format!(
"expected Lean ProcessModuleOutcome ctor (tag 0..=2), found tag {other}"
))),
}
}
}