#![cfg(feature = "admin")]
#![cfg_attr(docsrs, doc(cfg(feature = "admin")))]
use serde::{Deserialize, Serialize};
use crate::client::Client;
pub mod api_keys;
pub mod cost_report;
pub mod invites;
pub mod organization;
pub mod rate_limits;
pub mod usage_report;
pub mod users;
pub mod workspace_members;
pub mod workspaces;
pub struct Admin<'a> {
client: &'a Client,
}
impl<'a> Admin<'a> {
pub(crate) fn new(client: &'a Client) -> Self {
Self { client }
}
#[must_use]
pub fn organization(&self) -> organization::Organization<'a> {
organization::Organization::new(self.client)
}
#[must_use]
pub fn invites(&self) -> invites::Invites<'a> {
invites::Invites::new(self.client)
}
#[must_use]
pub fn users(&self) -> users::Users<'a> {
users::Users::new(self.client)
}
#[must_use]
pub fn workspaces(&self) -> workspaces::Workspaces<'a> {
workspaces::Workspaces::new(self.client)
}
#[must_use]
pub fn workspace_members(
&self,
workspace_id: impl Into<String>,
) -> workspace_members::WorkspaceMembers<'a> {
workspace_members::WorkspaceMembers::new(self.client, workspace_id.into())
}
#[must_use]
pub fn api_keys(&self) -> api_keys::ApiKeys<'a> {
api_keys::ApiKeys::new(self.client)
}
#[must_use]
pub fn usage_report(&self) -> usage_report::UsageReport<'a> {
usage_report::UsageReport::new(self.client)
}
#[must_use]
pub fn cost(&self) -> cost_report::Cost<'a> {
cost_report::Cost::new(self.client)
}
#[must_use]
pub fn rate_limits(&self) -> rate_limits::RateLimits<'a> {
rate_limits::RateLimits::new(self.client)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum OrganizationRole {
User,
Developer,
Billing,
Admin,
ClaudeCodeUser,
Other(String),
}
impl Serialize for OrganizationRole {
fn serialize<S: serde::Serializer>(&self, s: S) -> std::result::Result<S::Ok, S::Error> {
s.serialize_str(match self {
Self::User => "user",
Self::Developer => "developer",
Self::Billing => "billing",
Self::Admin => "admin",
Self::ClaudeCodeUser => "claude_code_user",
Self::Other(v) => v,
})
}
}
impl<'de> Deserialize<'de> for OrganizationRole {
fn deserialize<D: serde::Deserializer<'de>>(d: D) -> std::result::Result<Self, D::Error> {
let s = String::deserialize(d)?;
Ok(match s.as_str() {
"user" => Self::User,
"developer" => Self::Developer,
"billing" => Self::Billing,
"admin" => Self::Admin,
"claude_code_user" => Self::ClaudeCodeUser,
_ => Self::Other(s),
})
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum WriteOrganizationRole {
User,
Developer,
Billing,
ClaudeCodeUser,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum InviteStatus {
Accepted,
Expired,
Deleted,
Pending,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum WorkspaceRole {
User,
Developer,
RestrictedDeveloper,
Admin,
Billing,
Other(String),
}
impl Serialize for WorkspaceRole {
fn serialize<S: serde::Serializer>(&self, s: S) -> std::result::Result<S::Ok, S::Error> {
s.serialize_str(match self {
Self::User => "workspace_user",
Self::Developer => "workspace_developer",
Self::RestrictedDeveloper => "workspace_restricted_developer",
Self::Admin => "workspace_admin",
Self::Billing => "workspace_billing",
Self::Other(v) => v,
})
}
}
impl<'de> Deserialize<'de> for WorkspaceRole {
fn deserialize<D: serde::Deserializer<'de>>(d: D) -> std::result::Result<Self, D::Error> {
let s = String::deserialize(d)?;
Ok(match s.as_str() {
"workspace_user" => Self::User,
"workspace_developer" => Self::Developer,
"workspace_restricted_developer" => Self::RestrictedDeveloper,
"workspace_admin" => Self::Admin,
"workspace_billing" => Self::Billing,
_ => Self::Other(s),
})
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum WriteWorkspaceRole {
WorkspaceUser,
WorkspaceDeveloper,
WorkspaceRestrictedDeveloper,
WorkspaceAdmin,
}
#[derive(Debug, Clone, Default)]
#[non_exhaustive]
pub struct ListParams {
pub after_id: Option<String>,
pub before_id: Option<String>,
pub limit: Option<u32>,
}
impl ListParams {
pub(crate) fn to_query(&self) -> Vec<(&'static str, String)> {
let mut q = Vec::new();
if let Some(a) = &self.after_id {
q.push(("after_id", a.clone()));
}
if let Some(b) = &self.before_id {
q.push(("before_id", b.clone()));
}
if let Some(l) = self.limit {
q.push(("limit", l.to_string()));
}
q
}
}