Skip to content

Commit 9e3c7ed

Browse files
feat: add API error enum variant (#87)
1 parent 706cfbd commit 9e3c7ed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+113
-49
lines changed

src/admin_portal/operations/generate_portal_link.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,8 @@ impl GeneratePortalLink for AdminPortal<'_> {
108108
.json(&params)
109109
.send()
110110
.await?
111-
.handle_unauthorized_or_generic_error()?
111+
.handle_unauthorized_or_generic_error()
112+
.await?
112113
.json::<GeneratePortalLinkResponse>()
113114
.await?;
114115

src/core/error.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ pub enum WorkOsError<E> {
2222
/// An unhandled error occurred with the API request.
2323
#[error("request error")]
2424
RequestError(#[from] reqwest::Error),
25+
26+
/// The API responded with an error.
27+
#[error("API error")]
28+
ApiError(serde_json::Value),
2529
}
2630

2731
/// A WorkOS SDK result.

src/core/response.rs

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ where
1212

1313
/// Handles a generic error from the WorkOS API by converting it into a
1414
/// [`WorkOsError::RequestError`] response.
15-
fn handle_generic_error<E>(self) -> WorkOsResult<Self, E>;
15+
async fn handle_generic_error<E>(self) -> WorkOsResult<Self, E>;
1616

1717
/// Handles an unauthorized or generic error from the WorkOS API.
18-
fn handle_unauthorized_or_generic_error<E>(self) -> WorkOsResult<Self, E>;
18+
async fn handle_unauthorized_or_generic_error<E>(self) -> WorkOsResult<Self, E>;
1919
}
2020

2121
impl ResponseExt for Response {
@@ -27,14 +27,33 @@ impl ResponseExt for Response {
2727
}
2828
}
2929

30-
fn handle_generic_error<E>(self) -> WorkOsResult<Self, E> {
31-
match self.error_for_status() {
32-
Ok(response) => Ok(response),
33-
Err(err) => Err(WorkOsError::RequestError(err)),
30+
async fn handle_generic_error<E>(self) -> WorkOsResult<Self, E> {
31+
let status = self.status();
32+
if status.is_client_error() || status.is_server_error() {
33+
if self
34+
.headers()
35+
.get("content-type")
36+
.and_then(|value| value.to_str().ok())
37+
.is_some_and(|value| value.to_lowercase().starts_with("application/json"))
38+
{
39+
match self.json().await {
40+
Ok(value) => Err(WorkOsError::ApiError(value)),
41+
Err(err) => Err(WorkOsError::RequestError(err)),
42+
}
43+
} else {
44+
match self.error_for_status() {
45+
Ok(response) => Ok(response),
46+
Err(err) => Err(WorkOsError::RequestError(err)),
47+
}
48+
}
49+
} else {
50+
Ok(self)
3451
}
3552
}
3653

37-
fn handle_unauthorized_or_generic_error<E>(self) -> WorkOsResult<Self, E> {
38-
self.handle_unauthorized_error()?.handle_generic_error()
54+
async fn handle_unauthorized_or_generic_error<E>(self) -> WorkOsResult<Self, E> {
55+
self.handle_unauthorized_error()?
56+
.handle_generic_error()
57+
.await
3958
}
4059
}

src/directory_sync/operations/delete_directory.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ impl DeleteDirectory for DirectorySync<'_> {
7070
.bearer_auth(self.workos.key())
7171
.send()
7272
.await?
73-
.handle_unauthorized_or_generic_error()?;
73+
.handle_unauthorized_or_generic_error()
74+
.await?;
7475

7576
Ok(())
7677
}

src/directory_sync/operations/get_directory.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ impl GetDirectory for DirectorySync<'_> {
5252
.bearer_auth(self.workos.key())
5353
.send()
5454
.await?
55-
.handle_unauthorized_or_generic_error()?
55+
.handle_unauthorized_or_generic_error()
56+
.await?
5657
.json::<Directory>()
5758
.await?;
5859

src/directory_sync/operations/get_directory_group.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ impl GetDirectoryGroup for DirectorySync<'_> {
6363
.bearer_auth(self.workos.key())
6464
.send()
6565
.await?
66-
.handle_unauthorized_or_generic_error()?
66+
.handle_unauthorized_or_generic_error()
67+
.await?
6768
.json::<DirectoryGroup>()
6869
.await?;
6970

src/directory_sync/operations/get_directory_user.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ impl GetDirectoryUser for DirectorySync<'_> {
6363
.bearer_auth(self.workos.key())
6464
.send()
6565
.await?
66-
.handle_unauthorized_or_generic_error()?
66+
.handle_unauthorized_or_generic_error()
67+
.await?
6768
.json::<DirectoryUser>()
6869
.await?;
6970

src/directory_sync/operations/list_directories.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ impl ListDirectories for DirectorySync<'_> {
7373
.bearer_auth(self.workos.key())
7474
.send()
7575
.await?
76-
.handle_unauthorized_or_generic_error()?
76+
.handle_unauthorized_or_generic_error()
77+
.await?
7778
.json::<PaginatedList<Directory>>()
7879
.await?;
7980

src/directory_sync/operations/list_directory_groups.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ impl ListDirectoryGroups for DirectorySync<'_> {
8181
.bearer_auth(self.workos.key())
8282
.send()
8383
.await?
84-
.handle_unauthorized_or_generic_error()?
84+
.handle_unauthorized_or_generic_error()
85+
.await?
8586
.json::<PaginatedList<DirectoryGroup>>()
8687
.await?;
8788

src/directory_sync/operations/list_directory_users.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ impl ListDirectoryUsers for DirectorySync<'_> {
8181
.bearer_auth(self.workos.key())
8282
.send()
8383
.await?
84-
.handle_unauthorized_or_generic_error()?
84+
.handle_unauthorized_or_generic_error()
85+
.await?
8586
.json::<PaginatedList<DirectoryUser>>()
8687
.await?;
8788

0 commit comments

Comments
 (0)