use anyhow::Result;
use clap::Args;
use std::process::Command;
#[derive(Args)]
pub struct LogsArgs {
#[arg(short, long)]
pub follow: bool,
#[arg(short, long)]
pub filter: Option<String>,
#[arg(short, long, default_value = "100")]
pub lines: usize,
}
pub fn execute(args: &LogsArgs) -> Result<()> {
if args.follow {
println!("\x1b[1;36mFollowing porta logs (Ctrl+C to stop):\x1b[0m\n");
let mut cmd = Command::new("journalctl");
cmd.args(["-u", "porta", "-f", "--no-pager"]);
if let Some(filter) = &args.filter {
cmd.args(["-p", filter]);
}
let status = cmd.status()?;
if !status.success() {
println!("Failed to follow logs. Make sure porta service is installed.");
println!("You can also try: journalctl -u porta -f");
}
} else {
println!("\n\x1b[1;36mRecent Logs (last {} lines):\x1b[0m\n", args.lines);
let mut cmd = Command::new("journalctl");
cmd.args(["-u", "porta", "-n"]);
cmd.arg(&args.lines.to_string());
cmd.args(["--no-pager"]);
if let Some(filter) = &args.filter {
cmd.args(["-p", filter]);
}
let status = cmd.status()?;
if !status.success() {
println!("Failed to read logs. Make sure porta service is installed.");
println!("You can also try: journalctl -u porta -n {}", args.lines);
}
}
Ok(())
}