igv_rs/cli.rs
1use std::path::PathBuf;
2
3use clap::Parser;
4
5#[derive(Debug, Parser)]
6#[command(
7 name = "igv-rs",
8 version,
9 about = "Interactive terminal genome viewer (Rust rewrite of cligv)"
10)]
11pub struct Cli {
12 /// Path to the reference genome FASTA file (must have a .fai index).
13 pub fasta: PathBuf,
14
15 /// Path to a VCF file (must have a .tbi index). May be repeated in a
16 /// future iteration; today only the first is honored.
17 #[arg(short = 'v', long = "vcf")]
18 pub vcf: Option<PathBuf>,
19
20 /// Path to a BAM file (must have a .bai or .csi index). May be repeated
21 /// to display multiple alignment tracks.
22 #[arg(short = 'b', long = "bam")]
23 pub bam: Vec<PathBuf>,
24
25 /// Initial region (e.g. "chr1:1000-2000", "chr1:1000", "chr1").
26 #[arg(short = 'r', long = "region")]
27 pub region: Option<String>,
28
29 /// BAM tag to color reads by (two-character tag, e.g. "ha").
30 #[arg(short = 't', long = "tag")]
31 pub tag: Option<String>,
32
33 /// Path to a GFF3, GTF, BED, or narrowPeak/broadPeak annotation file.
34 /// Format auto-detected by extension. May be repeated.
35 #[arg(short = 'g', long = "annotation")]
36 pub annotations: Vec<std::path::PathBuf>,
37
38 /// Override annotation format auto-detection
39 /// (`gff`, `gff3`, `gtf`, `bed`, `narrowpeak`, or `broadpeak`).
40 /// Applies to all `-g` files.
41 #[arg(long = "annotation-format")]
42 pub annotation_format: Option<String>,
43
44 /// Path to a bigWig signal file (.bw / .bigwig). May be repeated.
45 #[arg(short = 's', long = "signal")]
46 pub signals: Vec<PathBuf>,
47
48 /// Override signal format auto-detection (currently only `bigwig`).
49 /// Applies to all `-s` files.
50 #[arg(long = "signal-format")]
51 pub signal_format: Option<String>,
52
53 /// Path to a BEDPE link file (.bedpe / .bedpe.gz). May be repeated.
54 /// Each file becomes its own track showing pairwise interactions
55 /// (chromatin loops, enhancer-promoter, ChIA-PET, etc.).
56 #[arg(short = 'l', long = "link")]
57 pub links: Vec<PathBuf>,
58
59 /// Override link format auto-detection (currently only `bedpe`).
60 /// Applies to all `-l` files.
61 #[arg(long = "link-format")]
62 pub link_format: Option<String>,
63
64 /// Drop links whose score column is below this value.
65 /// Records without a score are unaffected.
66 #[arg(long = "link-min-score")]
67 pub link_min_score: Option<f64>,
68
69 /// Use light theme (for light-background terminals).
70 #[arg(long = "light-mode")]
71 pub light_mode: bool,
72
73 /// Logging level filter.
74 #[arg(long = "log-level", default_value = "info")]
75 pub log_level: String,
76
77 /// Optional override config path. Defaults to
78 /// `$XDG_CONFIG_HOME/igv-rs/config.toml`.
79 #[arg(long = "config")]
80 pub config: Option<PathBuf>,
81
82 /// Render snapshots for every region in this BED file (no TUI).
83 /// Mutually exclusive with --snapshot-genes.
84 #[arg(long = "snapshot-bed")]
85 pub snapshot_bed: Option<PathBuf>,
86
87 /// Render snapshots for every gene name in this newline-separated
88 /// file (no TUI). Requires at least one -g/--annotation. Mutually
89 /// exclusive with --snapshot-bed.
90 #[arg(long = "snapshot-genes")]
91 pub snapshot_genes: Option<PathBuf>,
92
93 /// Output directory for batch snapshots. Required when
94 /// --snapshot-bed or --snapshot-genes is set.
95 #[arg(long = "snapshot-out")]
96 pub snapshot_out: Option<PathBuf>,
97
98 /// Output format for snapshots: `svg` (default) or `png`.
99 #[arg(long = "snapshot-format", default_value = "svg")]
100 pub snapshot_format: String,
101
102 /// Image width in px for snapshots.
103 #[arg(long = "snapshot-width", default_value_t = 1200)]
104 pub snapshot_width: u32,
105
106 /// Padding fraction added to each side of every batch region.
107 #[arg(long = "snapshot-flank", default_value_t = 0.1)]
108 pub snapshot_flank: f64,
109
110 /// Snapshot color theme: `igv` (default) or `tui`.
111 #[arg(long = "snapshot-theme", default_value = "igv")]
112 pub snapshot_theme: String,
113
114 /// Disable the `B` keystroke / browser launch (CI, headless servers).
115 #[arg(long = "no-browser")]
116 pub no_browser: bool,
117
118 /// TCP port for the browser-view HTTP server. 0 picks any free port.
119 #[arg(long = "serve-port", default_value_t = 0)]
120 pub serve_port: u16,
121}
122
123#[cfg(test)]
124mod tests {
125 use super::*;
126 use clap::Parser;
127
128 #[test]
129 fn no_browser_and_serve_port_parse() {
130 let cli = Cli::parse_from(["igv-rs", "ref.fa", "--no-browser", "--serve-port", "9001"]);
131 assert!(cli.no_browser);
132 assert_eq!(cli.serve_port, 9001);
133 }
134
135 #[test]
136 fn serve_port_defaults_to_zero() {
137 let cli = Cli::parse_from(["igv-rs", "ref.fa"]);
138 assert_eq!(cli.serve_port, 0);
139 assert!(!cli.no_browser);
140 }
141}