use anyhow::Result;
use clap::Parser;
use rascal::FileSystemSourceProvider;
use rascal::ProgramBuilder;
use std::fs;
use std::path::PathBuf;
#[derive(Parser, Debug)]
#[command(name = "rascal", version, author, about)]
struct Opt {
#[arg(name = "SCRIPT", help_heading = "Inputs")]
script: Vec<PathBuf>,
#[arg(
short,
long,
verbatim_doc_comment,
help_heading = "Generated SWF Options"
)]
output: Option<PathBuf>,
#[arg(short, long, help_heading = "Inputs")]
class: Vec<String>,
#[arg(long, long, help_heading = "Inputs")]
classpath: Vec<PathBuf>,
#[arg(
short = 'v',
long,
default_value_t = 15,
help_heading = "Generated SWF Options"
)]
swf_version: u8,
#[arg(long, default_value_t = 24.0, help_heading = "Generated SWF Options")]
frame_rate: f32,
}
fn main() -> Result<()> {
let mut opt = Opt::parse();
if opt.classpath.is_empty() {
opt.classpath.push(PathBuf::from("."));
}
let provider = FileSystemSourceProvider::with_roots(opt.classpath);
let mut builder = ProgramBuilder::new(provider);
for src in &opt.script {
builder.add_script(&src.file_name().unwrap().to_string_lossy());
}
for class in &opt.class {
builder.add_class(class);
}
let parsed = builder.build().unwrap_or_else(|e| panic!("{}", e));
let pcode = parsed.compile(opt.swf_version);
let output_path = opt
.output
.or_else(|| opt.script.first().map(|s| s.with_extension("swf")))
.unwrap_or_else(|| PathBuf::from("output.swf"));
let swf = pcode.to_swf(opt.frame_rate)?;
fs::write(&output_path, swf)?;
Ok(())
}