kr580 1.0.0

Desktop KR580VM80 / Intel 8080 emulator.
Documentation
use super::super::network::{NetworkEndpointError, parse_network_endpoint};
use super::super::settings_modal::SettingsDialog;

pub(super) type NetworkDefaults = ((String, u16), (String, u16));

pub(super) fn parse_network_defaults(
    dialog: &SettingsDialog,
) -> Result<NetworkDefaults, NetworkEndpointError> {
    let client = parse_network_endpoint(
        &dialog.draft_network_client_host,
        &dialog.draft_network_client_port,
    )?;
    let server = parse_network_endpoint(
        &dialog.draft_network_server_host,
        &dialog.draft_network_server_port,
    )?;
    Ok((client, server))
}

pub(super) fn apply_network_defaults(
    settings: &mut crate::persistence::NetworkSettings,
    ((client_host, client_port), (server_host, server_port)): NetworkDefaults,
) {
    settings.host = client_host;
    settings.port = client_port;
    settings.bind_host = server_host;
    settings.bind_port = server_port;
}

pub(super) fn is_directory_writable(path: &std::path::Path) -> bool {
    internal_is_directory_writable(path)
}

#[cfg(unix)]
fn internal_is_directory_writable(path: &std::path::Path) -> bool {
    use std::os::unix::ffi::OsStrExt;
    let mut buf = path.as_os_str().as_bytes().to_vec();
    buf.push(0);
    unsafe { libc::access(buf.as_ptr() as *const libc::c_char, libc::W_OK) == 0 }
}

#[cfg(windows)]
fn internal_is_directory_writable(path: &std::path::Path) -> bool {
    use std::time::{SystemTime, UNIX_EPOCH};
    let stamp = SystemTime::now()
        .duration_since(UNIX_EPOCH)
        .unwrap_or_default()
        .as_nanos();
    let test_file = path.join(format!(".kr580_{stamp:x}"));
    let ok = std::fs::OpenOptions::new()
        .write(true)
        .create_new(true)
        .open(&test_file)
        .is_ok();
    let _ = std::fs::remove_file(&test_file);
    ok
}