podpull 1.1.2

A fast, minimal CLI tool for downloading and synchronizing podcasts from RSS feeds
Documentation
# 3. CLI framework selection

Date: 2026-01-31

## Status

Accepted

## Context

podpull requires a CLI interface to accept user input:
- Feed URL or local file path (positional argument)
- Output directory (positional argument)
- Potentially additional flags in the future (verbose, dry-run, etc.)

We need a robust CLI parsing solution that provides good UX (help text, error messages, shell completions) without excessive boilerplate.

## Decision

We will use **clap** (v4) with the `derive` feature for CLI argument parsing.

```rust
use clap::Parser;

#[derive(Parser)]
#[command(name = "podpull", about = "Download and sync podcasts")]
struct Args {
    /// RSS feed URL or path to local RSS file
    feed: String,
    /// Output directory for downloaded episodes
    output_dir: PathBuf,
}
```

**Alternatives considered:**
- `argh`: Simpler, smaller, but fewer features (no shell completions, limited validation)
- `structopt`: Deprecated, functionality merged into clap 3+
- Manual parsing: Too much boilerplate, poor UX

## Consequences

**Benefits:**
- Type-safe argument parsing with derive macros
- Automatic `--help` and `--version` generation
- Built-in validation and error messages
- Shell completion generation available
- Excellent documentation and community support
- Future extensibility (subcommands, complex flags)

**Drawbacks:**
- Compile time impact from proc macros
- Binary size slightly larger than minimal alternatives

**Dependencies added:**
- `clap = { version = "4", features = ["derive"] }`