use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct OntologyReference {
#[serde(rename = "@type", skip_serializing_if = "Option::is_none")]
pub r#type: Option<String>,
pub id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub uri: Option<String>,
}
impl OntologyReference {
#[must_use]
pub const fn new(id: String) -> Self {
Self {
r#type: None,
id,
version: None,
uri: None,
}
}
#[must_use]
pub fn with_version(mut self, version: String) -> Self {
self.version = Some(version);
self
}
#[must_use]
pub fn with_uri(mut self, uri: String) -> Self {
self.uri = Some(uri);
self
}
}
#[cfg(test)]
mod tests {
use super::OntologyReference;
#[test]
fn round_trips_through_json() {
let reference = OntologyReference::new("grazing-plan".to_string())
.with_version("1.0.0".to_string())
.with_uri("https://mif-spec.dev/ontologies/grazing-plan".to_string());
let json = serde_json::to_string(&reference).unwrap();
let parsed: OntologyReference = serde_json::from_str(&json).unwrap();
assert_eq!(reference, parsed);
}
#[test]
fn omits_absent_optional_fields() {
let reference = OntologyReference::new("mif-base".to_string());
let json = serde_json::to_value(&reference).unwrap();
assert!(json.get("version").is_none());
assert!(json.get("uri").is_none());
assert!(json.get("@type").is_none());
}
}