use anyhow::Result;
use clap::Parser;
use std::path::PathBuf;
mod app;
use app::{scan_markdown_files, serve_markdown};
#[derive(Parser)]
#[command(name = "mdrvserve")]
#[command(about = "A simple HTTP server for markdown preview")]
#[command(version)]
struct Args {
path: PathBuf,
#[arg(short = 'H', long, default_value = "127.0.0.1")]
hostname: String,
#[arg(short, long, default_value = "3000")]
port: u16,
#[arg(short, long)]
open: bool,
#[arg(short, long)]
recursive: bool,
}
#[tokio::main]
async fn main() -> Result<()> {
let args = Args::parse();
let absolute_path = args.path.canonicalize().unwrap_or(args.path);
let (base_dir, tracked_files, is_directory_mode) = if absolute_path.is_file() {
let base_dir = absolute_path
.parent()
.unwrap_or_else(|| std::path::Path::new("."))
.to_path_buf();
let tracked_files = vec![absolute_path];
(base_dir, tracked_files, false)
} else if absolute_path.is_dir() {
let tracked_files = scan_markdown_files(&absolute_path, args.recursive)?;
if tracked_files.is_empty() {
anyhow::bail!("No markdown files found in directory");
}
(absolute_path, tracked_files, true)
} else {
anyhow::bail!("Path must be a file or directory");
};
serve_markdown(
base_dir,
tracked_files,
is_directory_mode,
args.recursive,
args.hostname,
args.port,
args.open,
)
.await?;
Ok(())
}