catl/
main.rs

1//! Display file contents or long‑list directories.
2//!
3//! # Arguments
4//! - `<path>` Path to file / directory / symlink to display.
5//!
6//! # Usage
7//! ```bash
8//! catl <path> # file -> cat; directory -> colored long listing
9//! ```
10//!
11//! # Errors
12//! - Fetching metadata for `<path>` fails.
13//! - Spawning or waiting on `cat` / `ls` fails.
14//! - Underlying command exits with non-zero status.
15#![feature(exit_status_error)]
16
17use std::process::Command;
18
19use color_eyre::eyre::eyre;
20use ytil_sys::cli::Args;
21
22/// Display file contents or long‑list directories.
23fn main() -> color_eyre::Result<()> {
24    color_eyre::install()?;
25
26    let args = ytil_sys::cli::get();
27
28    if args.has_help() {
29        println!("{}", include_str!("../help.txt"));
30        return Ok(());
31    }
32
33    let path = args.first().ok_or_else(|| eyre!("missing path arg | args={args:#?}"))?;
34
35    let metadata = std::fs::metadata(path)?;
36
37    if metadata.is_dir() {
38        return Ok(Command::new("ls")
39            .args(["-llAtrh", "--color=always", path])
40            .status()?
41            .exit_ok()?);
42    }
43
44    if metadata.is_file() || metadata.is_symlink() {
45        return Ok(Command::new("cat").args([path]).status()?.exit_ok()?);
46    }
47
48    Ok(())
49}