@@ -32,6 +32,8 @@ pub struct EncodableCrateUpload {
32
32
pub repository : Option < String > ,
33
33
#[ serde( default ) ]
34
34
pub links : Option < String > ,
35
+ #[ serde( default ) ]
36
+ pub rust_version : Option < EncodableRustVersion > ,
35
37
}
36
38
37
39
#[ derive( PartialEq , Eq , Hash , Serialize , Debug , Deref ) ]
@@ -42,6 +44,8 @@ pub struct EncodableDependencyName(pub String);
42
44
pub struct EncodableCrateVersion ( pub semver:: Version ) ;
43
45
#[ derive( Debug , Deref ) ]
44
46
pub struct EncodableCrateVersionReq ( pub String ) ;
47
+ #[ derive( Debug , Deref , Clone ) ]
48
+ pub struct EncodableRustVersion ( pub String ) ;
45
49
#[ derive( Serialize , Debug , Deref , Default ) ]
46
50
pub struct EncodableKeywordList ( pub Vec < EncodableKeyword > ) ;
47
51
#[ derive( Serialize , Debug , Deref ) ]
@@ -177,6 +181,23 @@ impl<'de> Deserialize<'de> for EncodableCrateVersionReq {
177
181
}
178
182
}
179
183
184
+ impl < ' de > Deserialize < ' de > for EncodableRustVersion {
185
+ fn deserialize < D : Deserializer < ' de > > ( d : D ) -> Result < EncodableRustVersion , D :: Error > {
186
+ let s = String :: deserialize ( d) ?;
187
+ match semver:: VersionReq :: parse ( & s) {
188
+ // Exclude semver operators like `^` and pre-release identifiers
189
+ Ok ( _) if s. chars ( ) . all ( |c| c. is_ascii_digit ( ) || c == '.' ) => {
190
+ Ok ( EncodableRustVersion ( s) )
191
+ }
192
+ Ok ( _) | Err ( ..) => {
193
+ let value = de:: Unexpected :: Str ( & s) ;
194
+ let expected = "a valid rust-version" ;
195
+ Err ( de:: Error :: invalid_value ( value, & expected) )
196
+ }
197
+ }
198
+ }
199
+ }
200
+
180
201
impl < ' de > Deserialize < ' de > for EncodableKeywordList {
181
202
fn deserialize < D : Deserializer < ' de > > ( d : D ) -> Result < EncodableKeywordList , D :: Error > {
182
203
let inner = <Vec < EncodableKeyword > as Deserialize < ' de > >:: deserialize ( d) ?;
@@ -224,6 +245,15 @@ impl Serialize for EncodableCrateVersionReq {
224
245
}
225
246
}
226
247
248
+ impl Serialize for EncodableRustVersion {
249
+ fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
250
+ where
251
+ S : Serializer ,
252
+ {
253
+ serializer. serialize_str ( & ( * * self ) . to_string ( ) )
254
+ }
255
+ }
256
+
227
257
use diesel:: pg:: Pg ;
228
258
use diesel:: serialize:: { self , Output , ToSql } ;
229
259
use diesel:: sql_types:: Text ;
0 commit comments