@@ -5,49 +5,53 @@ use serde::{Deserialize, Serialize};
55
66const 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 ) ]
2110pub ( 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