//! 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> { 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(()) }