11use async_trait:: async_trait;
2- use serde:: Serialize ;
2+ use reqwest:: { Response , StatusCode } ;
3+ use serde:: { Deserialize , Serialize } ;
34use thiserror:: Error ;
45
56use crate :: user_management:: { PasswordResetToken , User , UserManagement } ;
@@ -16,15 +17,83 @@ pub struct ResetPasswordParams<'a> {
1617}
1718
1819/// An error returned from [`ResetPassword`].
19- #[ derive( Debug , Error ) ]
20- pub enum ResetPasswordError { }
20+ #[ derive( Debug , Error , Deserialize ) ]
21+ #[ serde( tag = "code" , rename_all = "snake_case" ) ]
22+ pub enum ResetPasswordError {
23+ /// Password reset token not found error.
24+ #[ error( "password_reset_token_not_found: {message}" ) ]
25+ PasswordResetTokenNotFound {
26+ /// A human-readable message describing the error.
27+ message : String ,
28+ } ,
29+
30+ /// Password reset error.
31+ #[ error( "password_reset_error: {message}" ) ]
32+ PasswordResetError {
33+ /// A human-readable message describing the error.
34+ message : String ,
35+
36+ /// List of errors.
37+ errors : Vec < PasswordResetError > ,
38+ } ,
39+ }
2140
2241impl From < ResetPasswordError > for WorkOsError < ResetPasswordError > {
2342 fn from ( err : ResetPasswordError ) -> Self {
2443 Self :: Operation ( err)
2544 }
2645}
2746
47+ /// Password reset error.
48+ #[ derive( Debug , Error , Deserialize , Serialize ) ]
49+ #[ serde( tag = "code" , rename_all = "snake_case" ) ]
50+ pub enum PasswordResetError {
51+ /// Password reset token expired error.
52+ #[ error( "password_reset_token_expired: {message}" ) ]
53+ PasswordResetTokenExpired {
54+ /// A human-readable message describing the error.
55+ message : String ,
56+ } ,
57+
58+ /// Password too weak error.
59+ #[ error( "password_too_weak: {message}" ) ]
60+ PasswordTooWeak {
61+ /// A human-readable message describing the error.
62+ message : String ,
63+
64+ /// Human-readable suggestions.
65+ suggestions : Vec < String > ,
66+
67+ /// A human-readable warning.
68+ warning : String ,
69+ } ,
70+ }
71+
72+ #[ async_trait]
73+ pub ( crate ) trait HandleResetPasswordError
74+ where
75+ Self : Sized ,
76+ {
77+ async fn handle_reset_password_error ( self ) -> WorkOsResult < Self , ResetPasswordError > ;
78+ }
79+
80+ #[ async_trait]
81+ impl HandleResetPasswordError for Response {
82+ async fn handle_reset_password_error ( self ) -> WorkOsResult < Self , ResetPasswordError > {
83+ match self . error_for_status_ref ( ) {
84+ Ok ( _) => Ok ( self ) ,
85+ Err ( err) => match err. status ( ) {
86+ Some ( StatusCode :: BAD_REQUEST ) | Some ( StatusCode :: NOT_FOUND ) => {
87+ let error = self . json :: < ResetPasswordError > ( ) . await ?;
88+
89+ Err ( WorkOsError :: Operation ( error) )
90+ }
91+ _ => Err ( WorkOsError :: RequestError ( err) ) ,
92+ } ,
93+ }
94+ }
95+ }
96+
2897/// [WorkOS Docs: Reset the password](https://workos.com/docs/reference/user-management/password-reset/reset-password)
2998#[ async_trait]
3099pub trait ResetPassword {
@@ -79,7 +148,9 @@ impl ResetPassword for UserManagement<'_> {
79148 . json ( & params)
80149 . send ( )
81150 . await ?
82- . handle_unauthorized_or_generic_error ( ) ?
151+ . handle_unauthorized_error ( ) ?
152+ . handle_reset_password_error ( )
153+ . await ?
83154 . json :: < User > ( )
84155 . await ?;
85156
0 commit comments