Skip to main content

busbar_sf_tooling/client/
execute.rs

1use tracing::instrument;
2
3use crate::error::{Error, ErrorKind, Result};
4use crate::types::ExecuteAnonymousResult;
5
6impl super::ToolingClient {
7    /// Execute anonymous Apex code.
8    ///
9    /// # Example
10    ///
11    /// ```rust,ignore
12    /// let result = client.execute_anonymous("System.debug('Hello World');").await?;
13    /// if result.success {
14    ///     println!("Execution successful");
15    /// } else if let Some(err) = result.compile_problem {
16    ///     println!("Compilation error: {}", err);
17    /// }
18    /// ```
19    #[instrument(skip(self))]
20    pub async fn execute_anonymous(&self, apex_code: &str) -> Result<ExecuteAnonymousResult> {
21        let encoded = urlencoding::encode(apex_code);
22        let url = format!(
23            "{}/services/data/v{}/tooling/executeAnonymous/?anonymousBody={}",
24            self.client.instance_url(),
25            self.client.api_version(),
26            encoded
27        );
28
29        let result: ExecuteAnonymousResult = self.client.get_json(&url).await?;
30
31        // Check for compilation or execution errors
32        if !result.compiled {
33            if let Some(ref problem) = result.compile_problem {
34                return Err(Error::new(ErrorKind::ApexCompilation(problem.clone())));
35            }
36        }
37
38        if !result.success {
39            if let Some(ref message) = result.exception_message {
40                return Err(Error::new(ErrorKind::ApexExecution(message.clone())));
41            }
42        }
43
44        Ok(result)
45    }
46}