Small library for generating claude-code like unicde block mascots, and providing animations when they do stuff
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: --delete, --deleteanim, and _ as random character

- --delete <name>: remove a saved character from clood.json
- --deleteanim <name>: remove a saved animation from clood.json
- Using _ as the character name generates a random clood,
useful for previewing animations: clood _ blink

+43 -11
+43 -11
src/main.rs
··· 45 45 #[arg(long)] 46 46 saveanim: Option<String>, 47 47 48 + /// Delete a saved character by name 49 + #[arg(long)] 50 + delete: Option<String>, 51 + 52 + /// Delete a saved animation by name 53 + #[arg(long)] 54 + deleteanim: Option<String>, 55 + 48 56 /// Body height in rows [default: random 4..8] 49 57 #[arg(long)] 50 58 height: Option<usize>, ··· 168 176 let mut rng = rand::thread_rng(); 169 177 let mut save_file = load_save_file(); 170 178 171 - // Resolve the character: from a saved name or from CLI args. 179 + // Handle deletes first. 180 + if let Some(ref name) = args.delete { 181 + if save_file.characters.remove(name).is_some() { 182 + eprintln!("Deleted character '{}'", name); 183 + write_save_file(&save_file); 184 + } else { 185 + eprintln!("No character named '{}' to delete", name); 186 + } 187 + return; 188 + } 189 + if let Some(ref name) = args.deleteanim { 190 + if save_file.animations.remove(name).is_some() { 191 + eprintln!("Deleted animation '{}'", name); 192 + write_save_file(&save_file); 193 + } else { 194 + eprintln!("No animation named '{}' to delete", name); 195 + } 196 + return; 197 + } 198 + 199 + // Resolve the character: "_" = random, named = lookup, none = from CLI args. 172 200 let base = if let Some(ref name) = args.name { 173 - match save_file.characters.get(name) { 174 - Some(clood) => clood.clone(), 175 - None => { 176 - eprintln!("Unknown character '{}'. Saved characters:", name); 177 - if save_file.characters.is_empty() { 178 - eprintln!(" (none — use --save <name> to create one)"); 179 - } else { 180 - for key in save_file.characters.keys() { 181 - eprintln!(" {}", key); 201 + if name == "_" { 202 + build_clood_from_args(&args, &mut rng) 203 + } else { 204 + match save_file.characters.get(name) { 205 + Some(clood) => clood.clone(), 206 + None => { 207 + eprintln!("Unknown character '{}'. Saved characters:", name); 208 + if save_file.characters.is_empty() { 209 + eprintln!(" (none — use --save <name> to create one)"); 210 + } else { 211 + for key in save_file.characters.keys() { 212 + eprintln!(" {}", key); 213 + } 182 214 } 215 + std::process::exit(1); 183 216 } 184 - std::process::exit(1); 185 217 } 186 218 } 187 219 } else {