use crate::client::Client;
use crate::error::Result;
use crate::types::customer::{
BillingDetails, CreateCustomer, CreateCustomerRequest, Customer, CustomerResponse,
SingleCustomerResponse, UpdateCustomer, UpdateCustomerRequest,
};
use crate::types::ListResponse;
impl Client {
pub fn customers(&self) -> Customers<'_> {
Customers { client: self }
}
}
pub struct Customers<'a> {
client: &'a Client,
}
impl<'a> Customers<'a> {
pub async fn create(&self, params: CreateCustomer) -> Result<Customer> {
let request = CreateCustomerRequest { customer: params };
let response: CustomerResponse = self.client.post("/customers", &request).await?;
Ok(response.data.customer)
}
pub async fn get(&self, external_id: &str) -> Result<Customer> {
let response: SingleCustomerResponse = self
.client
.get(&format!("/customers/{}", external_id))
.await?;
Ok(response.customer)
}
pub async fn list(&self) -> Result<ListResponse<Customer>> {
self.client.get("/customers").await
}
pub async fn update(&self, external_id: &str, params: UpdateCustomer) -> Result<Customer> {
let request = UpdateCustomerRequest { customer: params };
let response: SingleCustomerResponse = self
.client
.put(&format!("/customers/{}", external_id), &request)
.await?;
Ok(response.customer)
}
pub async fn get_billing(&self, external_id: &str) -> Result<BillingDetails> {
self.client
.get(&format!("/customers/{}/billing", external_id))
.await
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_customers_accessor() {
let config = crate::Config::new("sk_test_123");
let client = Client::new(config).unwrap();
let _customers = client.customers();
}
}