async-ssh2-lite 0.4.4

Asynchronous ssh2.
Documentation
use std::{
    env, error,
    net::{IpAddr, SocketAddr},
    path::PathBuf,
};

//
pub(super) fn get_connect_addr() -> Result<SocketAddr, Box<dyn error::Error>> {
    let host = env::var("SSH_SERVER_HOST")
        .expect("Missing SSH_SERVER_HOST")
        .parse::<IpAddr>()?;

    let port = env::var("SSH_SERVER_PORT").expect("Missing SSH_SERVER_PORT");
    let port = port.parse::<u16>()?;

    Ok(SocketAddr::from((host, port)))
}

pub(super) fn get_username() -> Box<str> {
    env::var("SSH_USERNAME")
        .expect("Missing SSH_USERNAME")
        .into()
}

pub(super) fn get_password() -> Option<Box<str>> {
    env::var("SSH_PASSWORD").ok().map(Into::into)
}

pub(super) fn get_privatekey_path() -> PathBuf {
    if is_internal_test_openssh_server() {
        let manifest_path = if let Ok(manifest_dir) = env::var("CARGO_MANIFEST_DIR") {
            PathBuf::from(&manifest_dir)
        } else {
            PathBuf::new()
        };

        let keys_dir = manifest_path.join("tests").join("keys");
        let keys_dir = if keys_dir.exists() {
            keys_dir
        } else {
            manifest_path.join("tests").join("keys")
        };

        keys_dir.join("id_rsa")
    } else {
        env::var("SSH_PRIVATEKEY_PATH")
            .ok()
            .map(PathBuf::from)
            .expect("Missing SSH_PRIVATEKEY_PATH")
    }
}

pub(super) fn is_internal_test_openssh_server() -> bool {
    env::var("IS_INTERNAL_TEST_OPENSSH_SERVER")
        .ok()
        .map(|x| x == "1")
        == Some(true)
}

//
pub(super) fn init_logger() {
    let _ = env_logger::builder().is_test(true).try_init();
}

//
pub(super) fn get_listen_addr() -> SocketAddr {
    SocketAddr::from(([0, 0, 0, 0], portpicker::pick_unused_port().unwrap()))
}