Skip to main content

busbar_sf_rest/client/
describe.rs

1use tracing::instrument;
2
3use busbar_sf_client::security::soql;
4
5use crate::describe::{DescribeGlobalResult, DescribeSObjectResult};
6use crate::error::{Error, ErrorKind, Result};
7
8impl super::SalesforceRestClient {
9    /// Get a list of all SObjects available in the org.
10    ///
11    /// This is equivalent to calling `/services/data/vXX.0/sobjects/`.
12    #[instrument(skip(self))]
13    pub async fn describe_global(&self) -> Result<DescribeGlobalResult> {
14        self.client.rest_get("sobjects").await.map_err(Into::into)
15    }
16
17    /// Get detailed metadata for a specific SObject.
18    ///
19    /// This is equivalent to calling `/services/data/vXX.0/sobjects/{sobject}/describe`.
20    #[instrument(skip(self))]
21    pub async fn describe_sobject(&self, sobject: &str) -> Result<DescribeSObjectResult> {
22        if !soql::is_safe_sobject_name(sobject) {
23            return Err(Error::new(ErrorKind::Salesforce {
24                error_code: "INVALID_SOBJECT".to_string(),
25                message: "Invalid SObject name".to_string(),
26            }));
27        }
28        let path = format!("sobjects/{}/describe", sobject);
29        self.client.rest_get(&path).await.map_err(Into::into)
30    }
31}