38 lines
2.2 KiB
Rust
38 lines
2.2 KiB
Rust
//! Supplemental read-only bundle converter. Not part of the frozen product build.
|
|
use oa_core::{language, persistence, source_files, source_project, validate_candidate};
|
|
use std::{fs::OpenOptions, io::Write, path::Path};
|
|
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
let args: Vec<_> = std::env::args_os().skip(1).collect();
|
|
if args.len() != 2 { return Err("Expected snapshot bundle entry and NEW self-contained source path".into()); }
|
|
let limits = source_project::ProjectLimits::default();
|
|
let disk = source_files::load_project(Path::new(&args[0]), limits)?;
|
|
if disk.diagnostics.iter().any(|d| d.diagnostic.severity == oa_core::validation::Severity::Error) { return Err(format!("Disk diagnostics: {:?}", disk.diagnostics).into()); }
|
|
println!("Loader/lint warnings: {:?}", disk.diagnostics);
|
|
let bundle = disk.reachable_bundle();
|
|
if bundle.files != disk.bundle.files { return Err("Unreachable source buffers".into()); }
|
|
for (name, text) in &bundle.files {
|
|
match disk.expectations.get(name) {
|
|
Some(source_files::DiskExpectation::Bytes(bytes)) if bytes.as_slice() == text.as_bytes() => {},
|
|
_ => return Err(format!("Loader changed or omitted raw bytes: {name}").into()),
|
|
}
|
|
}
|
|
let compiled = source_project::compile_bundle(&bundle, limits)
|
|
.map_err(|e| format!("Compile diagnostics: {e:?}"))?;
|
|
if compiled.bundle != bundle || compiled.decoded.migration.is_some() {
|
|
return Err("Unexpected identity stabilization or migration".into());
|
|
}
|
|
let project = &compiled.decoded.project;
|
|
validate_candidate(project)?;
|
|
let source = language::format(project);
|
|
let decoded = persistence::decode_with_report(source.as_bytes())?;
|
|
if decoded.migration.is_some() || &decoded.project != project {
|
|
return Err("Self-contained source roundtrip changed complete Project".into());
|
|
}
|
|
let mut output = OpenOptions::new().write(true).create_new(true).open(&args[1])?;
|
|
output.write_all(source.as_bytes())?;
|
|
output.sync_all()?;
|
|
println!("Bundle files: {}; complete Project roundtrip exact", bundle.files.len());
|
|
println!("Engineering warnings (not loader errors): {:?}", compiled.diagnostics);
|
|
Ok(())
|
|
}
|