tunio 0.3.0

Crate for creating and managing TUN/TAP interfaces with async support. Works best with netconfig crate.
Documentation
use log::{error, info, warn};
use widestring::U16CStr;
use wintun_sys::{
    DWORD64, WINTUN_LOGGER_LEVEL, WINTUN_LOGGER_LEVEL_WINTUN_LOG_ERR,
    WINTUN_LOGGER_LEVEL_WINTUN_LOG_INFO, WINTUN_LOGGER_LEVEL_WINTUN_LOG_WARN,
};

pub unsafe extern "C" fn wintun_logger(
    level: WINTUN_LOGGER_LEVEL,
    _timestamp: DWORD64,
    message: *const wintun_sys::WCHAR,
) {
    let message = U16CStr::from_ptr_str(message);
    let message_utf8 = message.to_string_lossy();

    match level {
        WINTUN_LOGGER_LEVEL_WINTUN_LOG_INFO => info!("{message_utf8}"),
        WINTUN_LOGGER_LEVEL_WINTUN_LOG_WARN => warn!("{message_utf8}"),
        WINTUN_LOGGER_LEVEL_WINTUN_LOG_ERR => error!("{message_utf8}"),
        _ => error!("[invalid log level: {level}] {message_utf8}"),
    }
}