diff --git a/src/config.rs b/src/config.rs index d5c32b0fdeab663add3b3319571ee1cf93a24c2c..8cccdf76925a50ceee33bcbf9a7a93dd188c40f6 100644 --- a/src/config.rs +++ b/src/config.rs @@ -3,9 +3,9 @@ use crate::CONFIG_PATH; use std::io::{Write, Read}; use crate::tty_stuff::{choose_pattern, choose_command, choose_episode}; -#[derive(Serialize, Default, Deserialize)] +#[derive(Serialize, Default, Clone, Deserialize)] pub struct Config { - current_episode_count: usize, + pub current_episode_count: usize, pattern: String, #[serde(default = "default_command")] pub command: String, diff --git a/src/run_modes.rs b/src/run_modes.rs index a4acc8299992916796c1ac856617c81775a53281..a2d910add76ca32b7e1c112b1934a9c388fcd3d0 100644 --- a/src/run_modes.rs +++ b/src/run_modes.rs @@ -48,17 +48,35 @@ pub fn next_episode(current: usize) -> AppResult<usize> { } } +fn add_leading_zero(n: usize) -> String { + if n < 10 { + format!("0{}", n) + } else { + format!("{}", n) + } +} + +fn prepare_command(conf: Config) -> AppResult<String> { + let index = conf.current_episode_count; + Ok(conf.command + .replace("{}", conf.get_current_episode()?.as_str()) + .replace("{n}", format!("{}", index).as_str()) + .replace("{n+}", format!("{}", index + 1).as_str()) + .replace("{zn}", add_leading_zero(index).as_str()) + .replace("{zn+}", add_leading_zero(index).as_str())) +} + pub fn play() -> AppResult<()> { - let conf = Config::read()?; + let mut conf = Config::read()?; let mut episode = conf.get_current_episode()?; while !episode.is_empty() { let mut child = Command::new("sh") .arg("-c") - .arg(conf.command.replace("{}", episode.as_str())) + .arg(prepare_command(conf.clone())?) .spawn()?; child.wait()?; update_episode(next_episode)?; - let conf = Config::read()?; + conf = Config::read()?; episode = conf.get_current_episode()?; } Ok(())