summaryrefslogtreecommitdiff
path: root/src/metadata/mirrors.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/metadata/mirrors.rs')
-rw-r--r--src/metadata/mirrors.rs72
1 files changed, 67 insertions, 5 deletions
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<String, 16>),
}
-#[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<Mirror>,
pub expires: Option<DateTime>,
}
@@ -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<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
+ 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<Url>,
#[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<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
+ 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()
+ }
+}