mirror of
https://github.com/lsd-rs/lsd
synced 2025-03-05 07:27:20 +00:00
114 lines
2.7 KiB
Rust
114 lines
2.7 KiB
Rust
#![allow(
|
|
clippy::cast_precision_loss,
|
|
clippy::cast_sign_loss,
|
|
clippy::match_same_arms,
|
|
clippy::cast_possible_wrap
|
|
)]
|
|
|
|
#[macro_use]
|
|
extern crate clap;
|
|
extern crate ansi_term;
|
|
extern crate chrono;
|
|
extern crate chrono_humanize;
|
|
extern crate dirs;
|
|
extern crate libc;
|
|
extern crate lscolors;
|
|
#[cfg(test)]
|
|
extern crate tempfile;
|
|
extern crate term_grid;
|
|
extern crate terminal_size;
|
|
extern crate unicode_width;
|
|
extern crate wild;
|
|
extern crate xdg;
|
|
extern crate yaml_rust;
|
|
|
|
#[cfg(unix)]
|
|
extern crate users;
|
|
|
|
#[cfg(windows)]
|
|
extern crate winapi;
|
|
|
|
mod app;
|
|
mod color;
|
|
mod config_file;
|
|
mod core;
|
|
mod display;
|
|
mod flags;
|
|
mod icon;
|
|
mod meta;
|
|
mod sort;
|
|
|
|
use crate::config_file::Config;
|
|
use crate::core::Core;
|
|
use crate::flags::Flags;
|
|
use std::path::PathBuf;
|
|
|
|
/// Macro used to avoid panicking when the lsd method is used with a pipe and
|
|
/// stderr close before our program.
|
|
#[macro_export]
|
|
macro_rules! print_error {
|
|
($($arg:tt)*) => {
|
|
{
|
|
use std::io::Write;
|
|
|
|
let stderr = std::io::stderr();
|
|
|
|
{
|
|
let mut handle = stderr.lock();
|
|
// We can write on stderr, so we simply ignore the error and don't print
|
|
// and stop with success.
|
|
let res = handle.write_all(std::format!("lsd: {}\n\n",
|
|
std::format!($($arg)*)).as_bytes());
|
|
if res.is_err() {
|
|
std::process::exit(0);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
/// Macro used to avoid panicking when the lsd method is used with a pipe and
|
|
/// stdout close before our program.
|
|
#[macro_export]
|
|
macro_rules! print_output {
|
|
($($arg:tt)*) => {
|
|
use std::io::Write;
|
|
|
|
let stderr = std::io::stdout();
|
|
|
|
|
|
{
|
|
let mut handle = stderr.lock();
|
|
// We can write on stdout, so we simply ignore the error and don't print
|
|
// and stop with success.
|
|
let res = handle.write_all(std::format!($($arg)*).as_bytes());
|
|
if res.is_err() {
|
|
std::process::exit(0);
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
fn main() {
|
|
let matches = app::build().get_matches_from(wild::args_os());
|
|
|
|
// input translate glob FILE without single quote into real names
|
|
// for example:
|
|
// * to all files matched
|
|
// '*' remain as '*'
|
|
let inputs = matches
|
|
.values_of("FILE")
|
|
.expect("failed to retrieve cli value")
|
|
.map(PathBuf::from)
|
|
.collect();
|
|
|
|
let config = if matches.is_present("ignore-config") {
|
|
Config::with_none()
|
|
} else {
|
|
Config::default()
|
|
};
|
|
let flags = Flags::configure_from(&matches, &config).unwrap_or_else(|err| err.exit());
|
|
let core = Core::new(flags);
|
|
|
|
core.run(inputs);
|
|
}
|