@@ -373,16 +373,14 @@ pub async fn publish(app: AppState, req: BytesRequest) -> AppResult<Json<GoodCra
373373 . bin_names ( bin_names. as_slice ( ) )
374374 . build ( ) ;
375375
376- let version = match new_version. save ( conn, & verified_email_address) {
377- Err ( diesel:: result:: Error :: DatabaseError ( diesel:: result:: DatabaseErrorKind :: UniqueViolation , _) ) => {
378- return Err ( bad_request ( format_args ! (
379- "crate version `{}` is already uploaded" ,
380- new_version. num_no_build
381- ) ) ) ;
382- } ,
383- Err ( error) => return Err ( error. into ( ) ) ,
384- Ok ( version) => version,
385- } ;
376+ let version = new_version. save ( conn, & verified_email_address) . map_err ( |error| {
377+ use diesel:: result:: { Error , DatabaseErrorKind } ;
378+ match error {
379+ Error :: DatabaseError ( DatabaseErrorKind :: UniqueViolation , _) =>
380+ duplicate_version_error ( new_version. num_no_build ) ,
381+ error => error. into ( ) ,
382+ }
383+ } ) ?;
386384
387385 insert_version_owner_action (
388386 conn,
@@ -620,6 +618,10 @@ fn missing_metadata_error_message(missing: &[&str]) -> String {
620618 )
621619}
622620
621+ fn duplicate_version_error ( version : & str ) -> BoxedAppError {
622+ bad_request ( format ! ( "crate version `{version}` is already uploaded" ) )
623+ }
624+
623625fn validate_rust_version ( value : & str ) -> AppResult < ( ) > {
624626 match semver:: VersionReq :: parse ( value) {
625627 // Exclude semver operators like `^` and pre-release identifiers
0 commit comments