#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Deserialize)]
#[serde(rename_all = "kebab-case")]
pub(crate) enum Role {
Facade,
ProcMacro,
Subsystem,
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Deserialize)]
pub(crate) struct ReleaseMetadata {
pub(crate) publish: bool,
pub(crate) role: Option<Role>,
#[serde(rename = "release-unit")]
pub(crate) release_unit: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) enum CrateMetadata {
Absent,
Valid(ReleaseMetadata),
Malformed(String),
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parses_full_publishable_block() {
let toml = "\
publish = true
role = \"subsystem\"
release-unit = \"arcature-auth\"
";
let parsed: ReleaseMetadata = toml::from_str(toml).expect("full block parses");
assert!(parsed.publish);
assert_eq!(parsed.role, Some(Role::Subsystem));
assert_eq!(parsed.release_unit.as_deref(), Some("arcature-auth"));
}
#[test]
fn parses_core_facade_and_proc_macro_roles() {
let facade: ReleaseMetadata =
toml::from_str("publish = true\nrole = \"facade\"\nrelease-unit = \"core\"\n")
.expect("facade parses");
assert_eq!(facade.role, Some(Role::Facade));
let dx: ReleaseMetadata =
toml::from_str("publish = true\nrole = \"proc-macro\"\nrelease-unit = \"core\"\n")
.expect("proc-macro parses");
assert_eq!(dx.role, Some(Role::ProcMacro));
}
#[test]
fn parses_non_publishable_block_with_publish_only() {
let parsed: ReleaseMetadata =
toml::from_str("publish = false\n").expect("publish-only parses");
assert!(!parsed.publish);
assert_eq!(parsed.role, None);
assert_eq!(parsed.release_unit, None);
}
#[test]
fn rejects_unknown_role() {
let toml = "publish = true\nrole = \"glue\"\nrelease-unit = \"x\"\n";
let error = toml::from_str::<ReleaseMetadata>(toml)
.expect_err("unknown role must fail deserialization");
let message = error.to_string();
assert!(
message.contains("glue"),
"diagnostic names the bad value: {message}"
);
}
#[test]
fn release_unit_preserves_hyphenated_spelling() {
let parsed: ReleaseMetadata = toml::from_str(
"publish = true\nrole = \"subsystem\"\nrelease-unit = \"arcature-db\"\n",
)
.expect("hyphenated key parses");
assert_eq!(parsed.release_unit.as_deref(), Some("arcature-db"));
}
}