jsona-util 0.4.0

Shared code for jsona utilities.
Documentation
use std::{borrow::Cow, path::Path};

pub fn is_window<T: AsRef<str>>(path: T) -> bool {
    let mut chars = path.as_ref().chars();
    matches!(
        (chars.next().map(|v| v.is_ascii_alphabetic()), chars.next()),
        (Some(true), Some(':'))
    )
}

pub fn is_absolute<T: AsRef<str>>(path: T) -> bool {
    let path = path.as_ref();
    if is_window(&path) {
        true
    } else {
        path.starts_with('/')
    }
}

pub fn to_unix<T: AsRef<str>>(path: T) -> String {
    path.as_ref().replace('\\', "/")
}

pub fn encode_url<T: AsRef<str>>(path: T) -> String {
    let path = if is_window(&path) {
        let (driver, tail) = path.as_ref().split_at(1);
        format!(
            "/{}{}",
            driver.to_ascii_lowercase(),
            tail.replace('\\', "/")
        )
    } else {
        path.as_ref().to_string()
    };
    to_unix(path)
        .split('/')
        .map(urlencoding::encode)
        .collect::<Vec<Cow<str>>>()
        .join("/")
}

pub fn to_string<T: AsRef<Path>>(path: T) -> String {
    let path = path.as_ref().display().to_string();
    path.trim_end_matches(|v| v == '/' || v == '\\').to_string()
}