exver 0.2.1

Semver extension with upstream and downstream versions. Designed for package distributors
Documentation
use crate::exver;
use std::cmp::Ordering;
use std::str::FromStr;
use wasm_bindgen::prelude::*;

fn js_parse<T>(s: &str) -> Result<T, JsValue>
where
    T: FromStr,
    T::Err: std::fmt::Display,
{
    s.parse()
        .map_err(|e| format!("{}", e))
        .map_err(JsValue::from)
}

#[wasm_bindgen]
pub fn flavor(version: &str) -> Result<JsValue, JsValue> {
    js_parse::<exver::ExtendedVersion>(version).map(|v| {
        v.flavor()
            .map(wasm_bindgen::intern)
            .map(JsValue::from_str)
            .unwrap_or(JsValue::NULL)
    })
}

#[wasm_bindgen]
pub fn compare(lhs: &str, rhs: &str) -> Result<JsValue, JsValue> {
    let s = js_parse::<exver::ExtendedVersion>(lhs).map_err(JsValue::from)?;
    let t = js_parse::<exver::ExtendedVersion>(rhs).map_err(JsValue::from)?;
    Ok(s.partial_cmp(&t)
        .map(|cmp| match cmp {
            Ordering::Less => -1,
            Ordering::Equal => 0,
            Ordering::Greater => 1,
        })
        .map(JsValue::from)
        .unwrap_or(JsValue::NULL))
}

#[wasm_bindgen]
pub fn satisfies(version: &str, range: &str) -> Result<bool, JsValue> {
    let v = js_parse::<exver::ExtendedVersion>(version).map_err(JsValue::from)?;
    let r = js_parse::<exver::VersionRange>(range).map_err(JsValue::from)?;
    Ok(v.satisfies(&r))
}