ranim_cli/cli/
render.rs

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