clerk_fapi_rs/apis/
mod.rs

1pub use anyhow::Error as AnyhowError;
2pub use std::error;
3pub use std::fmt;
4
5#[derive(Debug, Clone)]
6pub struct ResponseContent<T> {
7    pub status: reqwest::StatusCode,
8    pub content: String,
9    pub entity: Option<T>,
10}
11
12#[derive(Debug)]
13pub enum Error<T> {
14    Reqwest(reqwest::Error),
15    Middleware(AnyhowError),
16    Serde(serde_json::Error),
17    Io(std::io::Error),
18    ResponseError(ResponseContent<T>),
19}
20
21impl<T> fmt::Display for Error<T> {
22    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
23        let (module, e) = match self {
24            Error::Reqwest(e) => ("reqwest", e.to_string()),
25            Error::Middleware(e) => ("middleware", e.to_string()),
26            Error::Serde(e) => ("serde", e.to_string()),
27            Error::Io(e) => ("IO", e.to_string()),
28            Error::ResponseError(e) => ("response", format!("status code {}", e.status)),
29        };
30        write!(f, "error in {module}: {e}")
31    }
32}
33
34impl<T: fmt::Debug> error::Error for Error<T> {
35    fn source(&self) -> Option<&(dyn error::Error + 'static)> {
36        Some(match self {
37            Error::Reqwest(e) => e,
38            Error::Middleware(e) => e.as_ref(),
39            Error::Serde(e) => e,
40            Error::Io(e) => e,
41            Error::ResponseError(_) => return None,
42        })
43    }
44}
45
46impl<T> From<reqwest::Error> for Error<T> {
47    fn from(e: reqwest::Error) -> Self {
48        Error::Reqwest(e)
49    }
50}
51
52impl<T> From<serde_json::Error> for Error<T> {
53    fn from(e: serde_json::Error) -> Self {
54        Error::Serde(e)
55    }
56}
57
58impl<T> From<std::io::Error> for Error<T> {
59    fn from(e: std::io::Error) -> Self {
60        Error::Io(e)
61    }
62}
63
64impl<T> From<anyhow::Error> for Error<T> {
65    fn from(e: anyhow::Error) -> Self {
66        Error::Middleware(e)
67    }
68}
69
70#[derive(Debug, Clone, PartialEq, Eq)]
71pub enum ContentType {
72    Json,
73    Text,
74    Unsupported(String),
75}
76
77impl From<&str> for ContentType {
78    fn from(s: &str) -> Self {
79        if s.contains("application/json") {
80            ContentType::Json
81        } else if s.contains("text/plain") {
82            ContentType::Text
83        } else {
84            ContentType::Unsupported(s.to_string())
85        }
86    }
87}
88
89pub fn urlencode<T: AsRef<str>>(s: T) -> String {
90    ::url::form_urlencoded::byte_serialize(s.as_ref().as_bytes()).collect()
91}
92
93pub fn parse_deep_object(prefix: &str, value: &serde_json::Value) -> Vec<(String, String)> {
94    if let serde_json::Value::Object(object) = value {
95        let mut params = vec![];
96
97        for (key, value) in object {
98            match value {
99                serde_json::Value::Object(_) => {
100                    params.append(&mut parse_deep_object(&format!("{prefix}[{key}]"), value))
101                }
102                serde_json::Value::Array(array) => {
103                    for (i, value) in array.iter().enumerate() {
104                        params.append(&mut parse_deep_object(
105                            &format!("{prefix}[{key}][{i}]"),
106                            value,
107                        ));
108                    }
109                }
110                serde_json::Value::String(s) => {
111                    params.push((format!("{prefix}[{key}]"), s.clone()))
112                }
113                _ => params.push((format!("{prefix}[{key}]"), value.to_string())),
114            }
115        }
116
117        return params;
118    }
119
120    unimplemented!("Only objects are supported with style=deepObject")
121}
122
123// Simple in memory file for profile picture uploads
124#[derive(Debug, Clone)]
125pub struct FileData {
126    pub name: String,
127    pub data: Vec<u8>,
128    pub mime_type: String,
129}
130
131pub mod active_sessions_api;
132pub use self::active_sessions_api::{GetSessionsError, GetUsersSessionsError, RevokeSessionError};
133pub mod backup_codes_api;
134pub use self::backup_codes_api::CreateBackupCodesError;
135pub mod client_api;
136pub use self::client_api::{
137    DeleteClientSessionsError, GetClientError, HandshakeClientError, PostClientError,
138    PutClientError,
139};
140pub mod configuration;
141pub use self::configuration::Configuration as ApiConfiguration;
142pub mod default_api;
143pub use self::default_api::{
144    ClearSiteDataError, GetAccountPortalError, GetDevBrowserInitError, GetProxyHealthError,
145    LinkClientError, PostDevBrowserInitSetCookieError, SyncClientError,
146};
147pub mod dev_browser_api;
148pub use self::dev_browser_api::CreateDevBrowserError;
149pub mod domains_api;
150pub use self::domains_api::{
151    AttemptOrganizationDomainVerificationError, CreateOrganizationDomainError,
152    DeleteOrganizationDomainError, GetOrganizationDomainError, ListOrganizationDomainsError,
153    PrepareOrganizationDomainVerificationError, UpdateOrganizationDomainEnrollmentModeError,
154};
155pub mod email_addresses_api;
156pub use self::email_addresses_api::{
157    CreateEmailAddressesError, DeleteEmailAddressError, GetEmailAddressError,
158    GetEmailAddressesError, SendVerificationEmailError, VerifyEmailAddressError,
159};
160pub mod environment_api;
161pub use self::environment_api::{GetEnvironmentError, UpdateEnvironmentError};
162pub mod external_accounts_api;
163pub use self::external_accounts_api::{
164    DeleteExternalAccountError, PostOAuthAccountsError, ReauthorizeExternalAccountError,
165    RevokeExternalAccountTokensError,
166};
167pub mod health_api;
168pub use self::health_api::GetHealthError;
169pub mod invitations_api;
170pub use self::invitations_api::{
171    BulkCreateOrganizationInvitationsError, CreateOrganizationInvitationsError,
172    GetAllPendingOrganizationInvitationsError, GetOrganizationInvitationsError,
173    RevokePendingOrganizationInvitationError,
174};
175pub mod members_api;
176pub use self::members_api::{
177    CreateOrganizationMembershipError, ListOrganizationMembershipsError,
178    RemoveOrganizationMemberError, UpdateOrganizationMembershipError,
179};
180pub mod membership_requests_api;
181pub use self::membership_requests_api::{
182    AcceptOrganizationMembershipRequestError, ListOrganizationMembershipRequestsError,
183    RejectOrganizationMembershipRequestError,
184};
185pub mod o_auth2_callbacks_api;
186pub use self::o_auth2_callbacks_api::{GetOauthCallbackError, PostOauthCallbackError};
187pub mod o_auth2_identify_provider_api;
188pub use self::o_auth2_identify_provider_api::{
189    GetOAuthConsentError, GetOAuthTokenError, GetOAuthTokenInfoError, GetOAuthUserInfoError,
190    GetOAuthUserInfoPostError, RequestOAuthAuthorizeError, RequestOAuthAuthorizePostError,
191    RevokeOAuthTokenError,
192};
193pub mod organization_api;
194pub use self::organization_api::{
195    CreateOrganizationError, DeleteOrganizationError, DeleteOrganizationLogoError,
196    GetOrganizationError, UpdateOrganizationError, UpdateOrganizationLogoError,
197};
198pub mod organizations_memberships_api;
199pub use self::organizations_memberships_api::{
200    AcceptOrganizationInvitationError, AcceptOrganizationSuggestionError,
201    DeleteOrganizationMembershipsError, GetOrganizationMembershipsError,
202    GetOrganizationSuggestionsError, GetUsersOrganizationInvitationsError,
203};
204pub mod passkeys_api;
205pub use self::passkeys_api::{
206    AttemptPasskeyVerificationError, DeletePasskeyError, PatchPasskeyError, PostPasskeyError,
207    ReadPasskeyError,
208};
209pub mod phone_numbers_api;
210pub use self::phone_numbers_api::{
211    DeletePhoneNumberError, GetPhoneNumbersError, PostPhoneNumbersError, ReadPhoneNumberError,
212    SendVerificationSmsError, UpdatePhoneNumberError, VerifyPhoneNumberError,
213};
214pub mod redirect_api;
215pub use self::redirect_api::RedirectToUrlError;
216pub mod roles_api;
217pub use self::roles_api::ListOrganizationRolesError;
218pub mod saml_api;
219pub use self::saml_api::{AcsError, SamlMetadataError};
220pub mod sessions_api;
221pub use self::sessions_api::{
222    AttemptSessionReverificationFirstFactorError, AttemptSessionReverificationSecondFactorError,
223    CreateSessionTokenError, CreateSessionTokenWithTemplateError, EndSessionError, GetSessionError,
224    PrepareSessionReverificationFirstFactorError, PrepareSessionReverificationSecondFactorError,
225    RemoveClientSessionsAndRetainCookieError, RemoveSessionError, StartSessionReverificationError,
226    TouchSessionError,
227};
228pub mod sign_ins_api;
229pub use self::sign_ins_api::{
230    AcceptTicketError, AttemptSignInFactorOneError, AttemptSignInFactorTwoError, CreateSignInError,
231    GetSignInError, PrepareSignInFactorOneError, PrepareSignInFactorTwoError, ResetPasswordError,
232    VerifyError,
233};
234pub mod sign_ups_api;
235pub use self::sign_ups_api::{
236    AttemptSignUpsVerificationError, CreateSignUpsError, GetSignUpsError,
237    PrepareSignUpsVerificationError, UpdateSignUpsError,
238};
239pub mod totp_api;
240pub use self::totp_api::{DeleteTotpError, PostTotpError, VerifyTotpError};
241pub mod user_api;
242pub use self::user_api::{
243    ChangePasswordError, CreateServiceTokenError, DeleteProfileImageError, DeleteUserError,
244    GetUserError, PatchUserError, RemovePasswordError, UpdateProfileImageError,
245};
246pub mod waitlist_api;
247pub use self::waitlist_api::JoinWaitlistError;
248pub mod web3_wallets_api;
249pub use self::web3_wallets_api::{
250    AttemptWeb3WalletVerificationError, DeleteWeb3WalletError, GetWeb3WalletsError,
251    PostWeb3WalletsError, PrepareWeb3WalletVerificationError, ReadWeb3WalletError,
252};
253pub mod well_known_api;
254pub use self::well_known_api::{
255    GetAndroidAssetLinksError, GetAppleAppSiteAssociationError, GetJwksError,
256    GetOAuth2AuthorizationServerMetadataError, GetOpenIdConfigurationError,
257};