use super::{DeleteResult, SObject, SaveResult, SoapHandler, UpsertResult, envelope, parse};
use crate::error::Result;
impl<A: crate::auth::Authenticator> SoapHandler<A> {
pub async fn create(&self, records: &[SObject]) -> Result<Vec<SaveResult>> {
let mut body = String::with_capacity(records.len().saturating_mul(128) + 32);
body.push_str("<urn:create>");
for record in records {
envelope::serialize_sobject(&mut body, record);
}
body.push_str("</urn:create>");
let xml = self.send(&body).await?;
parse::parse_save_results(&xml)
}
pub async fn update(&self, records: &[SObject]) -> Result<Vec<SaveResult>> {
let mut body = String::with_capacity(records.len().saturating_mul(128) + 32);
body.push_str("<urn:update>");
for record in records {
envelope::serialize_sobject(&mut body, record);
}
body.push_str("</urn:update>");
let xml = self.send(&body).await?;
parse::parse_save_results(&xml)
}
pub async fn upsert(
&self,
external_id_field: &str,
records: &[SObject],
) -> Result<Vec<UpsertResult>> {
let mut body = String::with_capacity(records.len().saturating_mul(128) + 64);
body.push_str("<urn:upsert><urn:externalIDFieldName>");
body.push_str(envelope::escape_text(external_id_field).as_ref());
body.push_str("</urn:externalIDFieldName>");
for record in records {
envelope::serialize_sobject(&mut body, record);
}
body.push_str("</urn:upsert>");
let xml = self.send(&body).await?;
parse::parse_upsert_results(&xml)
}
pub async fn delete<S: AsRef<str> + Sync>(&self, ids: &[S]) -> Result<Vec<DeleteResult>> {
let mut body = String::with_capacity(ids.len().saturating_mul(48) + 32);
body.push_str("<urn:delete>");
for id in ids {
body.push_str("<urn:ids>");
body.push_str(envelope::escape_text(id.as_ref()).as_ref());
body.push_str("</urn:ids>");
}
body.push_str("</urn:delete>");
let xml = self.send(&body).await?;
parse::parse_delete_results(&xml)
}
pub async fn retrieve<F: AsRef<str> + Sync, I: AsRef<str> + Sync>(
&self,
sobject_type: &str,
fields: &[F],
ids: &[I],
) -> Result<Vec<SObject>> {
let body = build_retrieve_body(sobject_type, fields, ids);
let xml = self.send(&body).await?;
parse::parse_retrieve(&xml)
}
}
pub(super) fn build_retrieve_body<F: AsRef<str>, I: AsRef<str>>(
sobject_type: &str,
fields: &[F],
ids: &[I],
) -> String {
let mut body =
String::with_capacity(fields.len().saturating_mul(24) + ids.len().saturating_mul(48) + 64);
body.push_str("<urn:retrieve><urn:fieldList>");
for (i, field) in fields.iter().enumerate() {
if i > 0 {
body.push_str(", ");
}
body.push_str(envelope::escape_text(field.as_ref()).as_ref());
}
body.push_str("</urn:fieldList><urn:sObjectType>");
body.push_str(envelope::escape_text(sobject_type).as_ref());
body.push_str("</urn:sObjectType>");
for id in ids {
body.push_str("<urn:ids>");
body.push_str(envelope::escape_text(id.as_ref()).as_ref());
body.push_str("</urn:ids>");
}
body.push_str("</urn:retrieve>");
body
}