From a483cc97d56a770c4ccf91dfccf790a8c2d0c9fa Mon Sep 17 00:00:00 2001 From: Kim Altintop Date: Wed, 29 Mar 2023 13:20:08 +0200 Subject: core: version each metadata type separately It turns out to be preferable to be able to break one type without affecting the other. So instead of the global SpecVersion, use a separate FmtVersion for each type. For compatibility, keep supporting spec_version fields (until next major bump of the respective types' version). Signed-off-by: Kim Altintop --- src/metadata/mirrors.rs | 72 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 67 insertions(+), 5 deletions(-) (limited to 'src/metadata/mirrors.rs') diff --git a/src/metadata/mirrors.rs b/src/metadata/mirrors.rs index 9124dd3..eb437c9 100644 --- a/src/metadata/mirrors.rs +++ b/src/metadata/mirrors.rs @@ -4,6 +4,7 @@ use std::{ borrow::Cow, collections::BTreeSet, + ops::Deref, }; use url::Url; @@ -12,13 +13,31 @@ use super::{ Custom, DateTime, Metadata, - SpecVersion, }; use crate::{ json::canonical, str::Varchar, }; +pub const FMT_VERSION: FmtVersion = FmtVersion(super::FmtVersion::new(0, 2, 0)); + +#[derive(Clone, Eq, Ord, PartialEq, PartialOrd, serde::Serialize, serde::Deserialize)] +pub struct FmtVersion(super::FmtVersion); + +impl Deref for FmtVersion { + type Target = super::FmtVersion; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl Default for FmtVersion { + fn default() -> Self { + FMT_VERSION + } +} + #[derive(Clone, serde::Serialize, serde::Deserialize)] pub struct Mirror { pub url: Url, @@ -42,9 +61,10 @@ pub enum Kind { Unknown(Varchar), } -#[derive(Clone, Default, serde::Serialize, serde::Deserialize)] +#[derive(Clone, Default, serde::Deserialize)] pub struct Mirrors { - pub spec_version: SpecVersion, + #[serde(alias = "spec_version")] + pub fmt_version: FmtVersion, pub mirrors: Vec, pub expires: Option, } @@ -67,9 +87,30 @@ impl<'a> From<&'a Mirrors> for Cow<'a, Mirrors> { } } -#[derive(Clone, Default, serde::Serialize, serde::Deserialize)] +impl serde::Serialize for Mirrors { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + + let mut s = serializer.serialize_struct("Mirrors", 3)?; + let version_field = if self.fmt_version < FMT_VERSION { + "spec_version" + } else { + "fmt_version" + }; + s.serialize_field(version_field, &self.fmt_version)?; + s.serialize_field("mirrors", &self.mirrors)?; + s.serialize_field("expires", &self.expires)?; + s.end() + } +} + +#[derive(Clone, Default, serde::Deserialize)] pub struct Alternates { - pub spec_version: SpecVersion, + #[serde(alias = "spec_version")] + pub fmt_version: FmtVersion, pub alternates: BTreeSet, #[serde(default)] pub custom: Custom, @@ -93,3 +134,24 @@ impl<'a> From<&'a Alternates> for Cow<'a, Alternates> { Self::Borrowed(a) } } + +impl serde::Serialize for Alternates { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + + let mut s = serializer.serialize_struct("Alternates", 4)?; + let version_field = if self.fmt_version < FMT_VERSION { + "spec_version" + } else { + "fmt_version" + }; + s.serialize_field(version_field, &self.fmt_version)?; + s.serialize_field("alternates", &self.alternates)?; + s.serialize_field("custom", &self.custom)?; + s.serialize_field("expires", &self.expires)?; + s.end() + } +} -- cgit v1.2.3