@@ -15,7 +15,7 @@ use utoipa::IntoParams;
15
15
16
16
use crate :: models:: { Crate , Version } ;
17
17
use crate :: schema:: { crates, versions} ;
18
- use crate :: util:: errors:: { AppResult , crate_not_found , version_not_found } ;
18
+ use crate :: util:: errors:: AppResult ;
19
19
20
20
#[ derive( Deserialize , FromRequestParts , IntoParams ) ]
21
21
#[ into_params( parameter_in = Path ) ]
@@ -54,9 +54,7 @@ async fn version_and_crate(
54
54
. first ( conn)
55
55
. await
56
56
. optional ( ) ?
57
- . ok_or_else ( || crate_not_found ( crate_name) ) ?;
58
-
59
- let version = version. ok_or_else ( || version_not_found ( crate_name, semver) ) ?;
57
+ . gather ( crate_name, semver) ?;
60
58
Ok ( ( version, krate) )
61
59
}
62
60
@@ -68,6 +66,7 @@ fn deserialize_version<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Str
68
66
69
67
mod ext {
70
68
use super :: * ;
69
+ use crate :: util:: errors:: { crate_not_found, version_not_found} ;
71
70
use crates_io_diesel_helpers:: canon_crate_name;
72
71
73
72
#[ diesel:: dsl:: auto_type( ) ]
@@ -90,4 +89,21 @@ mod ext {
90
89
crate_and_version_query ( & self . name , & self . version )
91
90
}
92
91
}
92
+
93
+ pub trait CrateVersionHelper < C , V > {
94
+ fn gather ( self , crate_name : & str , semver : & str ) -> AppResult < ( C , V ) > ;
95
+ fn gather_from_path ( self , path : & CrateVersionPath ) -> AppResult < ( C , V ) > ;
96
+ }
97
+
98
+ impl < C , V > CrateVersionHelper < C , V > for Option < ( C , Option < V > ) > {
99
+ fn gather ( self , crate_name : & str , semver : & str ) -> AppResult < ( C , V ) > {
100
+ let ( krate, version) = self . ok_or_else ( || crate_not_found ( crate_name) ) ?;
101
+ let version = version. ok_or_else ( || version_not_found ( crate_name, semver) ) ?;
102
+ Ok ( ( krate, version) )
103
+ }
104
+
105
+ fn gather_from_path ( self , path : & CrateVersionPath ) -> AppResult < ( C , V ) > {
106
+ self . gather ( & path. name , & path. version )
107
+ }
108
+ }
93
109
}
0 commit comments