use std::path::{Path, PathBuf};
use crate::conversion::{self, Format, Omission, Options};
use crate::core::Result;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ValidationReport {
pub path: PathBuf,
pub format: Format,
pub strict: bool,
pub passed: bool,
pub points: usize,
pub cells: usize,
pub fields: usize,
pub omissions: Vec<Omission>,
}
pub fn validate(path: impl AsRef<Path>, options: &Options) -> Result<ValidationReport> {
let path = path.as_ref();
let format = options
.input_format
.map_or_else(|| Format::from_input_path(path), Ok)?;
let mut read_options = options.clone();
if matches!(format, Format::Op2 | Format::Pch)
&& options.mesh.as_ref().is_some_and(|mesh| {
Format::from_input_path(mesh).is_ok_and(|mesh_format| mesh_format != Format::Bdf)
})
{
read_options.assume_basic_frame = true;
}
let read = conversion::read_path(path, &read_options)?;
let passed = !options.strict || read.omissions.is_empty();
Ok(ValidationReport {
path: path.to_path_buf(),
format: read.format,
strict: options.strict,
passed,
points: read.dataset.mesh.points.len(),
cells: read.dataset.mesh.cells.len(),
fields: read.dataset.fields.len(),
omissions: read.omissions,
})
}