use std::path::PathBuf;
struct Decompiler {
verbose: bool,
}
impl Decompiler {
fn new(verbose: bool) -> Self {
Self { verbose }
}
fn decompile(&self, _binary: &crate::dna::hel::binary::HelixBinary) -> Result<String, Box<dyn std::error::Error>> {
Ok("// Decompiled placeholder\n".to_string())
}
}
pub fn decompile_command(
input: PathBuf,
output: Option<PathBuf>,
decompress: bool,
verbose: bool,
quiet: bool,
) -> Result<(), Box<dyn std::error::Error>> {
let output_path = output.unwrap_or_else(|| {
let mut path = input.clone();
path.set_extension("hlx");
path
});
if verbose {
println!("🔓 Decompiling: {}", input.display());
println!(" Decompression: {}", if decompress { "Enabled" } else { "Disabled" });
}
let serializer = crate::mds::serializer::BinarySerializer::new(decompress);
let binary = serializer.read_from_file(&input)?;
let decompiler = Decompiler::new(verbose);
let source = decompiler.decompile(&binary)?;
std::fs::write(&output_path, source)?;
println!("✅ Decompiled successfully: {}", output_path.display());
if verbose {
let stats = binary.symbol_table.stats();
println!(
" Strings: {} (unique: {})", stats.total_strings, stats.unique_strings
);
println!(" Agents: {}", stats.agents);
println!(" Workflows: {}", stats.workflows);
}
Ok(())
}
fn decompile_with_progress(
input: PathBuf,
output: Option<PathBuf>,
decompress: bool,
verbose: bool,
) -> Result<(), Box<dyn std::error::Error>> {
use indicatif::{ProgressBar, ProgressStyle};
let pb = ProgressBar::new(100);
pb.set_style(
ProgressStyle::default_bar()
.template(
"{spinner:.green} [{elapsed_precise}] [{bar:40.cyan/blue}] {pos}/{len} {msg}",
)
.unwrap()
.progress_chars("#>-"),
);
pb.set_message("📖 Loading binary file...");
pb.inc(20);
let serializer = crate::mds::serializer::BinarySerializer::new(decompress);
let binary = serializer.read_from_file(&input)?;
pb.set_message("🔍 Analyzing binary...");
pb.inc(20);
if verbose {
println!(" 📊 Binary analysis: Extracting structure...");
}
pb.set_message("🔓 Decompiling...");
pb.inc(40);
let decompiler = Decompiler::new(verbose);
let source = decompiler.decompile(&binary)?;
pb.set_message("💾 Writing source file...");
pb.inc(15);
let output_path = output.unwrap_or_else(|| {
let mut path = input.clone();
path.set_extension("hlx");
path
});
std::fs::write(&output_path, source)?;
pb.finish_with_message("✅ Decompilation completed successfully!");
if verbose {
println!("🚀 Decompilation completed using all Helix modules!");
let stats = binary.symbol_table.stats();
println!(" 📊 Binary analysis: ✅");
println!(" 🔓 Decompiling: ✅");
println!(
" Strings: {} (unique: {})", stats.total_strings, stats.unique_strings
);
println!(" Agents: {}", stats.agents);
println!(" Workflows: {}", stats.workflows);
}
Ok(())
}