wacht 0.1.0-beta.5

Official Rust SDK for the Wacht platform, providing type-safe API client and authentication middleware
Documentation
use serde::{Deserialize, Serialize};
use std::str::FromStr;

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum SchemaVersion {
    V1,
    V2,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum SecondFactorPolicy {
    #[serde(rename = "disabled")]
    Disabled,
    #[serde(rename = "optional")]
    Optional,
    #[serde(rename = "required")]
    Required,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum VerificationStrategy {
    Otp,
    OauthGoogle,
    OauthGithub,
    OauthMicrosoft,
    OauthFacebook,
    OauthLinkedin,
    OauthDiscord,
    OauthApple,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserEmailAddress {
    pub id: String,
    pub created_at: String,
    pub updated_at: String,
    pub deployment_id: String,
    pub user_id: String,
    pub email: String,
    pub is_primary: bool,
    pub verified: bool,
    pub verified_at: String,
    pub verification_strategy: VerificationStrategy,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserPhoneNumber {
    pub id: String,
    pub created_at: String,
    pub updated_at: String,
    pub user_id: String,
    pub phone_number: String,
    pub country_code: String,
    pub verified: bool,
    pub verified_at: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SocialConnection {
    pub id: String,
    pub created_at: String,
    pub updated_at: String,
    pub user_id: String,
    pub user_email_address_id: String,
    pub provider: String,
    pub email_address: String,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Segment {
    pub id: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub created_at: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub updated_at: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub deleted_at: Option<String>,
    pub deployment_id: String,
    pub name: String,
    pub r#type: String, // "organization", "workspace", or "user"
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserDetails {
    pub id: String,
    pub created_at: String,
    pub updated_at: String,
    pub first_name: String,
    pub last_name: String,
    pub username: Option<String>,
    pub profile_picture_url: String,
    pub schema_version: SchemaVersion,
    pub disabled: bool,
    pub second_factor_policy: SecondFactorPolicy,
    pub availability: String,
    pub last_password_reset_at: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub active_organization_membership_id: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub active_workspace_membership_id: Option<String>,
    pub deployment_id: String,
    pub public_metadata: serde_json::Value,
    pub private_metadata: serde_json::Value,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub primary_email_address_id: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub primary_email_address: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub primary_phone_number_id: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub primary_phone_number: Option<String>,
    pub email_addresses: Vec<UserEmailAddress>,
    pub phone_numbers: Vec<UserPhoneNumber>,
    pub social_connections: Vec<SocialConnection>,
    pub segments: Vec<Segment>,
    pub has_password: bool,
    pub has_backup_codes: bool,
}