use std::ffi::{OsStr, OsString};
use std::path::{Path, PathBuf};
use clap::{CommandFactory, Parser};
use clap_complete::generate;
use podfeed::{
Result,
config::{self, Config},
};
fn main() -> Result<()> {
let config = Config::parse();
match config.command {
config::Command::Generate { data_dir, base_url } => {
let base_url = Path::new(&base_url);
smol::block_on(run(&data_dir, base_url))?;
}
config::Command::GenerateCompletion { shell } => {
let mut app = Config::command();
let name = app.get_name().to_string();
generate(shell, &mut app, name, &mut std::io::stdout());
}
}
Ok(())
}
async fn run(data_dir: &Path, base_url: &Path) -> Result<()> {
let directories = podfeed::convert::available_directories(data_dir).await?;
for dirpath in &directories {
let rss_content = podfeed::convert::process(data_dir, dirpath, base_url).await?;
let rss_filepath = append_ext("xml", dirpath);
smol::fs::write(rss_filepath, rss_content).await?;
}
Ok(())
}
fn append_ext(ext: impl AsRef<OsStr>, path: &Path) -> PathBuf {
let mut os_string: OsString = path.into();
os_string.push(".");
os_string.push(ext.as_ref());
os_string.into()
}