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 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}