use fframes::{
EncoderOptions, RenderOptions, StaticMediaProvider,
cli::{self, clap},
};
use fframes_components::{
Canvas, ComponentsMedia, ComponentsVideo, Fonts, Horizontal, Vertical, catalog, selection,
};
use std::process::ExitCode;
#[derive(Debug, clap::Args)]
struct Args {
#[arg(long, default_value = "all", global = true)]
components: String,
#[arg(long, global = true)]
portrait: bool,
#[arg(long, global = true)]
describe: bool,
}
fn main() -> ExitCode {
let args = cli::parse::<Args>();
let spec = args.app.components.clone();
if args.app.portrait {
let tall: Vertical = match ComponentsVideo::from_spec(&spec) {
Ok(video) => video,
Err(err) => return report(&err.to_string()),
};
describe(&tall, &spec);
if args.app.describe {
return ExitCode::SUCCESS;
}
render(tall, args)
} else {
let wide: Horizontal = match ComponentsVideo::from_spec(&spec) {
Ok(video) => video,
Err(err) => return report(&err.to_string()),
};
describe(&wide, &spec);
if args.app.describe {
return ExitCode::SUCCESS;
}
render(wide, args)
}
}
fn describe<C: Canvas>(video: &ComponentsVideo<C>, spec: &str) {
println!("{}", video.timeline_report());
match selection(spec) {
Ok(entries) => {
let ids: Vec<_> = entries.iter().map(|entry| entry.meta().id).collect();
println!(
"selection resolved to {} entries: {}",
ids.len(),
ids.join(", ")
);
}
Err(err) => eprintln!("warning: {err}"),
}
println!(
"this build has {} of the library's components compiled in",
catalog().len()
);
let _fonts = Fonts::default();
}
fn render<C: Canvas>(video: ComponentsVideo<C>, args: cli::Cli<Args>) -> ExitCode
where
ComponentsVideo<C>: fframes::Video + Send + Sync,
{
let media = ComponentsMedia::prepare().expect("embedded media");
cli::new(
&video,
RenderOptions {
media: Some(&media),
video_encoder_options: EncoderOptions {
preferred_encoder: Some("libx264"),
codec_params: Some(&[("crf", "20"), ("preset", "medium"), ("tune", "animation")]),
..Default::default()
},
..Default::default()
},
)
.args(args)
.run()
}
fn report(message: &str) -> ExitCode {
eprintln!("error: {message}");
ExitCode::FAILURE
}