1use anyhow::{Context, Result, bail};
2use log::{error, info};
3use ranim::{Scene, render_scene};
4
5use crate::{
6 RanimUserLibraryBuilder, Target,
7 cli::CliArgs,
8 workspace::{Workspace, get_target_package},
9};
10
11pub fn render_command(args: &CliArgs, scenes: &[String]) -> Result<()> {
12 info!("Loading workspace...");
13 let workspace = Workspace::current().unwrap();
14
15 info!("Getting target package...");
17 let (_, package_name) = get_target_package(&workspace, args);
18 info!("Target package name: {package_name}");
19
20 let target = Target::from(args.target.clone());
22 info!("Target: {target:?}");
23
24 let current_dir = std::env::current_dir().context("Failed to get current directory")?;
25 let mut builder = RanimUserLibraryBuilder::new(
26 workspace.clone(),
27 package_name.clone(),
28 target,
29 args.clone(),
30 current_dir.clone(),
31 );
32
33 builder.start_build();
34 let lib = builder
35 .res_rx
36 .recv_blocking()
37 .unwrap()
38 .context("Failed on initial build")?;
39
40 let all_scenes: Vec<&Scene> = lib.scenes().collect::<Vec<_>>();
41 let scenes_to_render: Vec<&Scene> = if scenes.is_empty() {
42 all_scenes.clone()
43 } else {
44 all_scenes
45 .iter()
46 .filter(|scene| scenes.iter().any(|s| s == scene.name))
47 .cloned()
48 .collect()
49 };
50
51 if scenes_to_render.is_empty() {
52 if scenes.is_empty() {
53 info!("No scenes found to render");
54 } else {
55 error!("No matching scenes found for: {scenes:?}");
56 error!(
57 "Available scenes: {:?}",
58 all_scenes.iter().map(|s| &s.name).collect::<Vec<_>>()
59 );
60 }
61 bail!("No scenes to render");
62 }
63
64 for scene in scenes_to_render {
65 info!("Rendering scene: {}", scene.name);
66 render_scene(scene);
67 }
68 Ok(())
69}