#[cfg(feature = "schema")]
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Debug, Default, PartialEq, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(rename_all = "kebab-case")]
pub struct IntegralNameMemoryConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub scope: Option<IntegralNameScope>,
#[serde(skip_serializing_if = "Option::is_none")]
pub contexts: Option<IntegralNameContexts>,
#[serde(skip_serializing_if = "Option::is_none")]
pub subsequent_form: Option<SubsequentNameForm>,
#[serde(
flatten,
default,
skip_serializing_if = "std::collections::BTreeMap::is_empty"
)]
#[cfg_attr(feature = "schema", schemars(skip))]
pub unknown_fields: std::collections::BTreeMap<String, serde_yaml::Value>,
}
impl IntegralNameMemoryConfig {
pub fn merge(&mut self, other: &IntegralNameMemoryConfig) {
if other.scope.is_some() {
self.scope = other.scope;
}
if other.contexts.is_some() {
self.contexts = other.contexts;
}
if other.subsequent_form.is_some() {
self.subsequent_form = other.subsequent_form;
}
}
pub fn resolve(&self) -> ResolvedIntegralNameMemoryConfig {
ResolvedIntegralNameMemoryConfig {
scope: self.scope.unwrap_or_default(),
contexts: self.contexts.unwrap_or_default(),
subsequent_form: self.subsequent_form.unwrap_or_default(),
}
}
}
#[derive(Debug, Default, PartialEq, Eq, Clone, Copy, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(rename_all = "kebab-case")]
pub enum IntegralNameScope {
#[default]
Document,
Chapter,
Section,
}
#[derive(Debug, Default, PartialEq, Eq, Clone, Copy, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(rename_all = "kebab-case")]
pub enum IntegralNameContexts {
#[default]
BodyOnly,
BodyAndNotes,
}
#[derive(Debug, Default, PartialEq, Eq, Clone, Copy, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(rename_all = "kebab-case")]
pub enum SubsequentNameForm {
#[default]
Short,
FamilyOnly,
}
#[derive(Debug, Default, PartialEq, Eq, Clone, Copy, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(rename_all = "kebab-case")]
pub enum ShortNameDisplay {
#[default]
FullThenParenthetical,
FullThenBracketed,
ShortThenParenthetical,
ShortThenBracketed,
}
#[cfg(test)]
#[allow(clippy::unwrap_used, reason = "Panicking is acceptable in tests.")]
mod tests {
use super::*;
#[test]
fn captures_unknown_fields_for_forward_compat() {
let yaml = r#"
scope: chapter
future-key: true
"#;
let cfg: IntegralNameMemoryConfig = serde_yaml::from_str(yaml).unwrap();
assert!(cfg.unknown_fields.contains_key("future-key"));
assert_eq!(cfg.scope, Some(IntegralNameScope::Chapter));
}
}
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub struct ResolvedIntegralNameMemoryConfig {
pub scope: IntegralNameScope,
pub contexts: IntegralNameContexts,
pub subsequent_form: SubsequentNameForm,
}
#[derive(Debug, Default, PartialEq, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(rename_all = "kebab-case")]
pub struct OrgAbbreviationMemoryConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub scope: Option<IntegralNameScope>,
#[serde(skip_serializing_if = "Option::is_none")]
pub contexts: Option<IntegralNameContexts>,
#[serde(skip_serializing_if = "Option::is_none")]
pub short_name_display: Option<ShortNameDisplay>,
#[serde(
flatten,
default,
skip_serializing_if = "std::collections::BTreeMap::is_empty"
)]
#[cfg_attr(feature = "schema", schemars(skip))]
pub unknown_fields: std::collections::BTreeMap<String, serde_yaml::Value>,
}
impl OrgAbbreviationMemoryConfig {
pub fn merge(&mut self, other: &OrgAbbreviationMemoryConfig) {
if other.scope.is_some() {
self.scope = other.scope;
}
if other.contexts.is_some() {
self.contexts = other.contexts;
}
if other.short_name_display.is_some() {
self.short_name_display = other.short_name_display;
}
}
pub fn resolve(&self) -> ResolvedOrgAbbreviationMemoryConfig {
ResolvedOrgAbbreviationMemoryConfig {
scope: self.scope.unwrap_or_default(),
contexts: self.contexts.unwrap_or_default(),
short_name_display: self.short_name_display.unwrap_or_default(),
}
}
}
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub struct ResolvedOrgAbbreviationMemoryConfig {
pub scope: IntegralNameScope,
pub contexts: IntegralNameContexts,
pub short_name_display: ShortNameDisplay,
}