SalesforceClient

Struct SalesforceClient 

Source
pub struct SalesforceClient { /* private fields */ }
Expand description

Enterprise-grade Salesforce API client

This client provides comprehensive features for production use:

  • Automatic token refresh via OAuth
  • Intelligent caching to reduce API calls
  • Retry logic with exponential backoff
  • Rate limiting to respect API quotas
  • Automatic pagination for large result sets
  • Full CRUD operations
  • Type-safe query building

§Design Principles

  • Enterprise-ready: Built-in retry, caching, and rate limiting
  • Type-safe: Generic methods with compile-time guarantees
  • Async-first: Non-blocking I/O throughout
  • Observable: Comprehensive tracing for debugging
  • Composable: Arc-based sharing for concurrent use

Implementations§

Source§

impl SalesforceClient

Source

pub fn new(config: ClientConfig) -> Self

Creates a new Salesforce API client with the given configuration

§Example
use salesforce_client::{SalesforceClient, ClientConfig};

let config = ClientConfig::new(
    "https://yourinstance.salesforce.com",
    "00D... your token",
);

let client = SalesforceClient::new(config);
Source

pub async fn with_oauth(credentials: OAuthCredentials) -> SfResult<Self>

Create a client with OAuth credentials (automatic token refresh)

§Example
use salesforce_client::{SalesforceClient, OAuthCredentials};

let credentials = OAuthCredentials {
    client_id: "your_client_id".to_string(),
    client_secret: "your_client_secret".to_string(),
    refresh_token: Some("your_refresh_token".to_string()),
    username: None,
    password: None,
};

// This will be implemented with TokenManager integration
// let client = SalesforceClient::with_oauth(credentials).await?;
Source

pub async fn query<T>(&self, soql: impl AsRef<str>) -> SfResult<Vec<T>>

Execute a SOQL query with caching, retry, and rate limiting

This method automatically handles:

  • Rate limiting (waits if limit exceeded)
  • Caching (returns cached results if available)
  • Retry logic (retries transient failures)
  • Pagination (fetches only first page by default)
§Example
let accounts: Vec<Account> = client
    .query("SELECT Id, Name FROM Account WHERE AnnualRevenue > 1000000")
    .await?;
Source

pub async fn query_all<T>(&self, soql: impl AsRef<str>) -> SfResult<Vec<T>>

Query with automatic pagination - fetches ALL results

Warning: This can consume significant memory for large result sets. For queries returning >100k records, consider using query_paginated instead.

§Example
// Fetches all accounts, automatically handling pagination
let accounts: Vec<Account> = client
    .query_all("SELECT Id, Name FROM Account")
    .await?;
Source

pub async fn query_paginated<T>( &self, soql: &str, ) -> SfResult<PaginatedQuery<T>>

Get a paginated query iterator for manual pagination control

This is the most memory-efficient way to handle large result sets.

§Example
let mut pages = client
    .query_paginated::<Account>("SELECT Id FROM Account")
    .await?;

while let Some(batch) = pages.next().await? {
    for account in batch {
        println!("{:?}", account);
    }
}
Source

pub async fn insert<T: Serialize>( &self, sobject: &str, data: &T, ) -> SfResult<InsertResponse>

Insert a new record

§Example
#[derive(Serialize)]
struct NewAccount {
    #[serde(rename = "Name")]
    name: String,
    #[serde(rename = "Industry")]
    industry: String,
}

let account = NewAccount {
    name: "Acme Corporation".to_string(),
    industry: "Technology".to_string(),
};

let response = client.insert("Account", &account).await?;
println!("Created account with ID: {}", response.id);
Source

pub async fn update<T: Serialize>( &self, sobject: &str, id: &str, data: &T, ) -> SfResult<()>

Update an existing record

§Example
#[derive(Serialize)]
struct AccountUpdate {
    #[serde(rename = "Name")]
    name: String,
}

let update = AccountUpdate {
    name: "Acme Corp (Updated)".to_string(),
};

client.update("Account", "001xx000003DGbX", &update).await?;
println!("Account updated successfully");
Source

pub async fn delete(&self, sobject: &str, id: &str) -> SfResult<()>

Delete a record

§Example

client.delete("Account", "001xx000003DGbX").await?;
println!("Account deleted successfully");
Source

pub async fn upsert<T: Serialize>( &self, sobject: &str, builder: UpsertBuilder, data: &T, ) -> SfResult<InsertResponse>

Upsert a record (insert or update based on external ID)

§Example
#[derive(Serialize)]
struct Account {
    #[serde(rename = "Name")]
    name: String,
}

let account = Account {
    name: "Acme Corporation".to_string(),
};

let upsert = UpsertBuilder::new("External_Id__c", "EXT-12345");
let response = client.upsert("Account", upsert, &account).await?;
println!("Upserted account with ID: {}", response.id);
Source

pub async fn clear_cache(&self)

Clear the query cache

Source

pub fn config(&self) -> &ClientConfig

Get the current configuration

Source

pub fn rate_limit_status(&self) -> RateLimitStatus

Get rate limiter status

Trait Implementations§

Source§

impl Clone for SalesforceClient

Source§

fn clone(&self) -> SalesforceClient

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more