1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
//! A crate with bunch of lazy macros
#[cfg(feature = "time")]
extern crate time;

///Macro to construct subprocess command
///
///# Arguments:
///
///* ```cmd``` - to specify command name.
///
///# Usage:
///
///* ```exec_cmd!(cmd=>"cmd_name", [arg1, arg2, ..., argN]) ```
#[macro_export]
macro_rules! cmd {
    (cmd=>$cmd:expr, $($arg:expr),*) => { std::process::Command::new($cmd)$(.arg($arg))* }
}

///Macro to exectute subprocess silently.
///
///All output will be redirected to null.
///
///# Arguments:
///
///* ```cmd``` - to specify command name.
///
///# Usage:
///
///* ```exec_cmd!(cmd=>"cmd_name", [arg1, arg2, ..., argN]) ```
///
///Returns status code
#[macro_export]
macro_rules! exec_silent_cmd {
    (cmd=>$cmd:expr, $($arg:expr),*) => { std::process::Command::new($cmd)
                                                                 .stderr(std::process::Stdio::null())
                                                                 .stdout(std::process::Stdio::null())
                                                                 $(.arg($arg))*
                                                                 .status().unwrap() }
}

/// Macro to check if given path/string belongs to file.
///
/// Returns false if no such file exists or cannot access it.
#[macro_export]
macro_rules! is_file {
    ($path:expr) => { std::fs::metadata($path).ok().map_or(false, |data| data.is_file()); };
}

/// Macro to check if given path/string belongs to directory.
///
/// Returns false if no such directory exists or cannot access it.
#[macro_export]
macro_rules! is_dir {
    ($path:expr) => { std::fs::metadata($path).ok().map_or(false, |data| data.is_dir()); };
}

///Trace macro like ```println```
///
///It uses ```format_args!``` for creating formatted string from passed arguments.
///
///Prints with the following format: ```file!:line! - [Message]```
///
///# Time feature
///By adding ```time``` crate and enabling feature ```time```
///the date in following format will be used: ```[dd/mt/yy hh-mm-ss.ms]```
///
///Example of enabling:
///```rusty-cute-macros = { version = "*", features = ["time"] }```
#[cfg(not(feature = "time"))]
#[macro_export]
macro_rules! trace {
    ($($arg:tt)+) => {
        println!("{}", format_args!("{}:{} - {}", file!(), line!(), format_args!($($arg)+)));
    }
}

#[cfg(feature = "time")]
#[macro_export]
macro_rules! trace {
    ($($arg:tt)+) => {
        println!("{}", format_args!("[{}] {}:{} - {}", time::now().strftime("%x %X.%f").unwrap(), file!(), line!(), format_args!($($arg)+)));
    }
}


///Multiple-drop macro.
///
///It accepts any identifiers so be careful to pass right one.
#[macro_export]
macro_rules! drop {
    ($($arg:ident),+) => {
        $(drop($arg);)+
    };
}

///```try!``` clone that returns None instead of Err<T>
#[macro_export]
macro_rules! try_none {
    ($expr:expr) => (match $expr {
        Ok(val) => val,
        Err(_) => return None,
    })
}