Files
piglet/src/main.rs
Sebastian Krüger 12793893c3 Fix: Propagate user exit signal to break animation loop
**CRITICAL BUG FIX**: When using -l (loop), the outer loop in main.rs
was restarting the animation even after user pressed exit keys.

Changes:
- render() now returns Result<bool> instead of Result<()>
- Returns true when user presses exit key (q/ESC/Ctrl+C)
- Returns false when animation completes naturally
- main.rs checks return value and breaks loop on user exit

This fixes the infinite loop issue where pressing q/ESC/Ctrl+C
had no effect when using the -l flag.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 07:08:24 +01:00

106 lines
2.3 KiB
Rust

mod animation;
mod cli;
mod color;
mod figlet;
mod parser;
mod utils;
use anyhow::Result;
use clap::Parser;
use cli::PigletCli;
#[tokio::main]
async fn main() -> Result<()> {
// Parse CLI arguments
let args = PigletCli::parse();
// Show banner on first run
if std::env::args().len() == 1 {
show_welcome();
return Ok(());
}
// Verify figlet is installed
figlet::FigletWrapper::check_installed()?;
// Run the piglet magic
run_piglet(args).await?;
Ok(())
}
async fn run_piglet(args: PigletCli) -> Result<()> {
use crate::animation::AnimationEngine;
use crate::color::ColorEngine;
use crate::utils::terminal::TerminalManager;
// Parse duration
let duration_ms = parser::duration::parse_duration(&args.duration)?;
// Create figlet wrapper and render base ASCII art
let figlet = figlet::FigletWrapper::new()
.with_font(args.font.as_deref())
.with_args(args.figlet_args);
let ascii_art = figlet.render(&args.text)?;
// Setup color engine
let color_engine = ColorEngine::new()
.with_palette(args.color_palette.as_deref())?
.with_gradient(args.color_gradient.as_deref())?;
// Setup animation engine
let animation_engine = AnimationEngine::new(ascii_art, duration_ms, args.fps)
.with_effect(&args.motion_effect)?
.with_easing(&args.motion_ease)?
.with_color_engine(color_engine);
// Setup terminal
let mut terminal = TerminalManager::new()?;
terminal.setup()?;
// Run animation
loop {
let user_exited = animation_engine.run(&mut terminal).await?;
// If user pressed exit key, stop looping
if user_exited {
break;
}
// If not looping, stop after one animation
if !args.loop_animation {
break;
}
}
// Cleanup
terminal.cleanup()?;
Ok(())
}
fn show_welcome() {
println!(
r"
____ _ __ __
/ __ \(_)___ _/ /__ / /_
/ /_/ / / __ `/ / _ \/ __/
/ ____/ / /_/ / / __/ /_
/_/ /_/\__, /_/\___/\__/
/____/
🐷 Piglet - Animated Figlet Wrapper
Usage: piglet [TEXT] [OPTIONS]
Examples:
piglet Hello -p red,blue,green
piglet World -g linear-gradient(90deg, red, blue) -e fade-in
piglet Cool! -e typewriter -d 2s -i ease-out
Run 'piglet --help' for more information.
"
);
}