Skip to content

Commit ce44566

Browse files
sypharGuillaumeGomez
authored andcommitted
move logic into deserialize/serialize impls
1 parent 72d22b4 commit ce44566

File tree

1 file changed

+33
-29
lines changed

1 file changed

+33
-29
lines changed

src/db/types/dependencies.rs

Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,49 +5,53 @@ use serde::{Deserialize, Serialize};
55

66
const DEFAULT_KIND: &str = "normal";
77

8-
/// The three possible representations of a dependency in our internal JSON format
9-
/// in the `releases.dependencies` column.
10-
#[derive(Debug, Clone, Serialize, Deserialize)]
11-
#[serde(untagged)]
12-
enum Dep {
13-
Two((String, VersionReq)),
14-
Three((String, VersionReq, String)),
15-
Four((String, VersionReq, String, bool)),
16-
}
17-
188
/// A crate dependency in our internal representation for releases.dependencies json.
19-
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Deref)]
20-
#[serde(from = "Dep", into = "Dep")]
9+
#[derive(Debug, Clone, PartialEq, Deref)]
2110
pub(crate) struct ReleaseDependency(Dependency);
2211

23-
impl From<Dep> for ReleaseDependency {
24-
fn from(src: Dep) -> Self {
12+
impl<'de> Deserialize<'de> for ReleaseDependency {
13+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
14+
where
15+
D: serde::Deserializer<'de>,
16+
{
17+
/// The three possible representations of a dependency in our internal JSON format
18+
/// in the `releases.dependencies` column.
19+
#[derive(Serialize, Deserialize)]
20+
#[serde(untagged)]
21+
enum Repr {
22+
/// just [name, version]``
23+
Basic((String, VersionReq)),
24+
/// [name, version, kind]
25+
WithKind((String, VersionReq, String)),
26+
/// [name, version, kind, optional]
27+
Full((String, VersionReq, String, bool)),
28+
}
29+
30+
let src = Repr::deserialize(deserializer)?;
2531
let (name, req, kind, optional) = match src {
26-
Dep::Two((name, req)) => (name, req, DEFAULT_KIND.into(), false),
27-
Dep::Three((name, req, kind)) => (name, req, kind, false),
28-
Dep::Four((name, req, kind, optional)) => (name, req, kind, optional),
32+
Repr::Basic((name, req)) => (name, req, DEFAULT_KIND.into(), false),
33+
Repr::WithKind((name, req, kind)) => (name, req, kind, false),
34+
Repr::Full((name, req, kind, optional)) => (name, req, kind, optional),
2935
};
3036

31-
ReleaseDependency(Dependency {
37+
Ok(ReleaseDependency(Dependency {
3238
name,
3339
req,
3440
kind: Some(kind),
3541
optional,
3642
rename: None,
37-
})
43+
}))
3844
}
3945
}
4046

41-
impl From<ReleaseDependency> for Dep {
42-
// dependency serialization for new releases.
43-
fn from(rd: ReleaseDependency) -> Self {
44-
let d = rd.0;
45-
Dep::Four((
46-
d.name,
47-
d.req,
48-
d.kind.unwrap_or_else(|| DEFAULT_KIND.into()),
49-
d.optional,
50-
))
47+
impl Serialize for ReleaseDependency {
48+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
49+
where
50+
S: serde::Serializer,
51+
{
52+
let dep = &self.0;
53+
let kind = dep.kind.as_deref().unwrap_or(DEFAULT_KIND);
54+
(dep.name.as_str(), &dep.req, kind, dep.optional).serialize(serializer)
5155
}
5256
}
5357

0 commit comments

Comments
 (0)