Skip to main content

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}