use std::env;
use vb6parse::files::ProjectFile;
use vb6parse::io::SourceFile;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let current_directory = env::current_dir()?;
let project_directory = current_directory.join("tests/data/audiostation/Audiostation");
let project_path = project_directory.join("Audiostation.vbp");
println!("Reading project file from: {}", project_path.display());
let project_content =
std::fs::read(&project_path).expect("Failed to read audiostation project file. This example requires the test data to be present. run `git submodule update --init --recursive` in the terminal from the repository root to fetch the test data.");
let project_source = SourceFile::decode_with_replacement("audiostation.vbp", &project_content)
.expect("Failed to decode project source file.");
let project_parse_result = ProjectFile::parse(&project_source);
if project_parse_result.has_failures() {
for failure in project_parse_result.failures() {
failure.print();
}
}
let project = project_parse_result.unwrap();
println!("Project Title: {}", project.properties.title);
println!("Startup Object: {}", project.properties.startup);
println!(
"Number of Modules: {}",
project.modules().collect::<Vec<_>>().len()
);
println!(
"Number of Forms: {}",
project.forms().collect::<Vec<_>>().len()
);
println!(
"Number of Classes: {}",
project.classes().collect::<Vec<_>>().len()
);
println!();
if let Some(last_module) = project.modules().last() {
let module_path = project_directory
.join(last_module.path.replace('\\', "/"))
.to_str()
.unwrap()
.to_string();
println!("Reading module file from: {module_path:?}");
let module_source =
SourceFile::decode_with_replacement(&module_path, &std::fs::read(&module_path)?)
.expect("Failed to decode module source file.");
let module_parse_result = vb6parse::ModuleFile::parse(&module_source);
if module_parse_result.has_failures() {
for failure in module_parse_result.failures() {
failure.print();
}
}
let module_file = module_parse_result.unwrap();
let cst = &module_file.cst;
println!("\nCST for module '{module_path}':");
println!("CST Root Kind: {:?}", cst.root_kind());
println!("Number of children: {}", cst.child_count());
println!("\nFull text of the CST:");
println!("{}", cst.text());
println!("\nDebug tree structure:");
println!("{}", cst.debug_tree());
}
Ok(())
}