busbar_sf_tooling/client/
composite.rs1use busbar_sf_client::security::soql;
2use tracing::instrument;
3
4use crate::error::{Error, ErrorKind, Result};
5
6impl super::ToolingClient {
7 #[instrument(skip(self, request))]
35 pub async fn composite(
36 &self,
37 request: &busbar_sf_rest::CompositeRequest,
38 ) -> Result<busbar_sf_rest::CompositeResponse> {
39 let url = self.client.tooling_url("composite");
40 self.client
41 .post_json(&url, request)
42 .await
43 .map_err(Into::into)
44 }
45
46 #[instrument(skip(self, request))]
53 pub async fn composite_batch(
54 &self,
55 request: &busbar_sf_rest::CompositeBatchRequest,
56 ) -> Result<busbar_sf_rest::CompositeBatchResponse> {
57 let url = self.client.tooling_url("composite/batch");
58 self.client
59 .post_json(&url, request)
60 .await
61 .map_err(Into::into)
62 }
63
64 #[instrument(skip(self, request))]
75 pub async fn composite_tree(
76 &self,
77 sobject: &str,
78 request: &busbar_sf_rest::CompositeTreeRequest,
79 ) -> Result<busbar_sf_rest::CompositeTreeResponse> {
80 if !soql::is_safe_sobject_name(sobject) {
81 return Err(Error::new(ErrorKind::Salesforce {
82 error_code: "INVALID_SOBJECT".to_string(),
83 message: "Invalid SObject name".to_string(),
84 }));
85 }
86 let url = self
87 .client
88 .tooling_url(&format!("composite/tree/{}", sobject));
89 self.client
90 .post_json(&url, request)
91 .await
92 .map_err(Into::into)
93 }
94}
95
96#[cfg(test)]
97mod tests {
98 use super::super::ToolingClient;
99
100 #[test]
101 fn test_composite_url_construction() {
102 let client = ToolingClient::new("https://na1.salesforce.com", "token").unwrap();
103
104 let url = client.client.tooling_url("composite");
105 assert_eq!(
106 url,
107 "https://na1.salesforce.com/services/data/v62.0/tooling/composite"
108 );
109 }
110
111 #[test]
112 fn test_composite_batch_url_construction() {
113 let client = ToolingClient::new("https://na1.salesforce.com", "token").unwrap();
114
115 let url = client.client.tooling_url("composite/batch");
116 assert_eq!(
117 url,
118 "https://na1.salesforce.com/services/data/v62.0/tooling/composite/batch"
119 );
120 }
121
122 #[test]
123 fn test_composite_tree_url_construction() {
124 let client = ToolingClient::new("https://na1.salesforce.com", "token").unwrap();
125
126 let url = client
127 .client
128 .tooling_url(&format!("composite/tree/{}", "ApexClass"));
129 assert_eq!(
130 url,
131 "https://na1.salesforce.com/services/data/v62.0/tooling/composite/tree/ApexClass"
132 );
133 }
134}