use std::path::PathBuf;
use anyhow::{anyhow, Result};
use clap::{Args, Parser, Subcommand};
#[derive(Parser)]
#[command(
name = "share-the-mark",
version,
about = "share-the-mark: receive design-feedback change-briefs and expose them to a coding agent"
)]
pub struct Cli {
#[command(subcommand)]
pub command: Command,
}
#[derive(Subcommand)]
pub enum Command {
Serve(ServeArgs),
Start(ServeArgs),
Stop {
#[arg(long)]
port: Option<u16>,
},
Status {
#[arg(long)]
port: Option<u16>,
},
Pending {
#[arg(long)]
dir: Option<PathBuf>,
},
List {
#[arg(long)]
all: bool,
#[arg(long)]
dir: Option<PathBuf>,
},
Show {
id: String,
#[arg(long)]
json: bool,
#[arg(long)]
keep_unread: bool,
#[arg(long)]
dir: Option<PathBuf>,
},
Request {
url: String,
#[arg(long)]
json: bool,
#[arg(long, default_value_t = 600)]
timeout: u64,
#[arg(long)]
port: Option<u16>,
#[arg(long)]
dir: Option<PathBuf>,
},
Skill {
#[command(subcommand)]
command: SkillCommand,
},
}
#[derive(Args)]
pub struct ServeArgs {
#[arg(long)]
pub port: Option<u16>,
#[arg(long)]
pub dir: Option<PathBuf>,
#[arg(long)]
pub idle_timeout: Option<u64>,
}
#[derive(Subcommand)]
pub enum SkillCommand {
Install {
#[arg(long)]
dir: Option<PathBuf>,
},
}
pub fn resolve_port(flag: Option<u16>) -> u16 {
flag.or_else(|| {
std::env::var("SHARE_THE_MARK_PORT")
.ok()
.and_then(|s| s.parse().ok())
})
.unwrap_or(8787)
}
pub fn resolve_idle(flag: Option<u64>) -> u64 {
flag.or_else(|| {
std::env::var("SHARE_THE_MARK_IDLE")
.ok()
.and_then(|s| s.parse().ok())
})
.unwrap_or(0)
}
pub fn resolve_dir(flag: Option<PathBuf>) -> Result<PathBuf> {
if let Some(dir) = flag {
return Ok(dir);
}
if let Ok(dir) = std::env::var("SHARE_THE_MARK_DIR") {
return Ok(PathBuf::from(dir));
}
let project = directories::ProjectDirs::from("", "", "share-the-mark")
.ok_or_else(|| anyhow!("cannot determine a data directory"))?;
Ok(project.data_dir().to_path_buf())
}