use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "kebab-case")]
pub enum Registry {
CratesIo,
Npm,
RubyGems,
PyPi,
GoProxy,
Hex,
Hackage,
Packagist,
Maven,
Pub,
Oci { registry_url: String },
Private {
url: String,
protocol: String,
},
None,
}
impl Registry {
#[must_use]
pub const fn as_str(&self) -> &'static str {
match self {
Self::CratesIo => "crates-io",
Self::Npm => "npm",
Self::RubyGems => "rubygems",
Self::PyPi => "pypi",
Self::GoProxy => "go-proxy",
Self::Hex => "hex",
Self::Hackage => "hackage",
Self::Packagist => "packagist",
Self::Maven => "maven",
Self::Pub => "pub",
Self::Oci { .. } => "oci",
Self::Private { .. } => "private",
Self::None => "none",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn as_str_covers_every_variant_stably() {
for r in [
Registry::CratesIo,
Registry::Npm,
Registry::RubyGems,
Registry::PyPi,
Registry::GoProxy,
Registry::Hex,
Registry::Hackage,
Registry::Packagist,
Registry::Maven,
Registry::Pub,
Registry::Oci {
registry_url: "ghcr.io".into(),
},
Registry::Private {
url: "https://internal".into(),
protocol: "cargo-v1".into(),
},
Registry::None,
] {
assert!(!r.as_str().is_empty());
}
}
#[test]
fn round_trips_through_serde() {
let r = Registry::Oci {
registry_url: "ghcr.io/pleme-io".into(),
};
let j = serde_json::to_string(&r).unwrap();
let parsed: Registry = serde_json::from_str(&j).unwrap();
assert_eq!(r, parsed);
}
}