cmd_lib_cf 1.3.4

Modified version of cmd_lib with CREATE_NO_WINDOW built in
Documentation
use crate::{CmdEnv, CmdResult};
use log::*;
use std::io::{Read, Write};
use std::path::PathBuf;

#[doc(hidden)]
pub fn builtin_echo(env: &mut CmdEnv) -> CmdResult {
    let msg = env.args()[1..].join(" ");
    writeln!(env.stdout(), "{}", msg)
}

#[doc(hidden)]
pub fn builtin_die(env: &mut CmdEnv) -> CmdResult {
    error!("FATAL: {}", env.args()[1..].join(" "));
    std::process::exit(1);
}

#[doc(hidden)]
pub fn builtin_error(env: &mut CmdEnv) -> CmdResult {
    error!("{}", env.args()[1..].join(" "));
    Ok(())
}

#[doc(hidden)]
pub fn builtin_warn(env: &mut CmdEnv) -> CmdResult {
    warn!("{}", env.args()[1..].join(" "));
    Ok(())
}

#[doc(hidden)]
pub fn builtin_info(env: &mut CmdEnv) -> CmdResult {
    info!("{}", env.args()[1..].join(" "));
    Ok(())
}

#[doc(hidden)]
pub fn builtin_debug(env: &mut CmdEnv) -> CmdResult {
    debug!("{}", env.args()[1..].join(" "));
    Ok(())
}

#[doc(hidden)]
pub fn builtin_trace(env: &mut CmdEnv) -> CmdResult {
    trace!("{}", env.args()[1..].join(" "));
    Ok(())
}

#[doc(hidden)]
pub fn builtin_cat(env: &mut CmdEnv) -> CmdResult {
    if env.args().len() == 1 {
        let mut buf = vec![];
        env.stdin().read_to_end(&mut buf)?;
        env.stdout().write_all(&buf)?;
        return Ok(());
    }

    let mut file = PathBuf::from(env.args()[1].to_owned());
    if file.is_relative() {
        file = PathBuf::from(env.current_dir()).join(file);
    }
    env.stdout().write_all(&std::fs::read(file)?)?;
    Ok(())
}