mirror of https://github.com/Trivernis/nenv
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.3 KiB
Rust
50 lines
1.3 KiB
Rust
use std::borrow::Cow;
|
|
|
|
use serde::{Deserialize, Deserializer};
|
|
|
|
/// Represents a single nodejs version info entry
|
|
/// as retrieved from nodejs.org
|
|
#[derive(Clone, Debug, Deserialize)]
|
|
pub struct VersionInfo {
|
|
#[serde(deserialize_with = "deserialize_prefixed_version")]
|
|
pub version: semver::Version,
|
|
pub date: String,
|
|
pub modules: Option<String>,
|
|
|
|
#[serde(deserialize_with = "deserialize_false_as_none")]
|
|
pub lts: Option<String>,
|
|
pub security: bool,
|
|
#[serde(flatten)]
|
|
pub module_versions: ModuleVersions,
|
|
pub files: Vec<String>,
|
|
}
|
|
|
|
#[derive(Clone, Debug, Deserialize)]
|
|
pub struct ModuleVersions {
|
|
pub v8: String,
|
|
pub npm: Option<String>,
|
|
pub uv: Option<String>,
|
|
pub zlib: Option<String>,
|
|
pub openssl: Option<String>,
|
|
}
|
|
|
|
fn deserialize_false_as_none<'de, D: Deserializer<'de>>(
|
|
deserializer: D,
|
|
) -> Result<Option<String>, D::Error> {
|
|
Ok(String::deserialize(deserializer).ok())
|
|
}
|
|
|
|
fn deserialize_prefixed_version<'de, D: Deserializer<'de>>(
|
|
deserializer: D,
|
|
) -> Result<semver::Version, D::Error> {
|
|
let version = String::deserialize(deserializer)?;
|
|
let version = if let Some(v) = version.strip_prefix('v') {
|
|
Cow::Borrowed(v)
|
|
} else {
|
|
Cow::Owned(version)
|
|
};
|
|
let version = semver::Version::parse(version.as_ref()).map_err(serde::de::Error::custom)?;
|
|
|
|
Ok(version)
|
|
}
|