use super::types::SObject;
const NS_ENVELOPE: &str = "http://schemas.xmlsoap.org/soap/envelope/";
const NS_PARTNER: &str = "urn:partner.soap.sforce.com";
const NS_SOBJECT: &str = "urn:sobject.partner.soap.sforce.com";
const NS_XSI: &str = "http://www.w3.org/2001/XMLSchema-instance";
pub fn escape_text(value: &str) -> std::borrow::Cow<'_, str> {
quick_xml::escape::escape(value)
}
pub fn build_envelope(session_id: &str, client: Option<&str>, body: &str) -> String {
let mut out = String::with_capacity(body.len() + session_id.len() + 512);
out.push_str(r#"<?xml version="1.0" encoding="UTF-8"?>"#);
out.push_str("<soapenv:Envelope xmlns:soapenv=\"");
out.push_str(NS_ENVELOPE);
out.push_str("\" xmlns:urn=\"");
out.push_str(NS_PARTNER);
out.push_str("\" xmlns:sf=\"");
out.push_str(NS_SOBJECT);
out.push_str("\" xmlns:xsi=\"");
out.push_str(NS_XSI);
out.push_str("\"><soapenv:Header><urn:SessionHeader><urn:sessionId>");
out.push_str(escape_text(session_id).as_ref());
out.push_str("</urn:sessionId></urn:SessionHeader>");
if let Some(client) = client {
out.push_str("<urn:CallOptions><urn:client>");
out.push_str(escape_text(client).as_ref());
out.push_str("</urn:client></urn:CallOptions>");
}
out.push_str("</soapenv:Header><soapenv:Body>");
out.push_str(body);
out.push_str("</soapenv:Body></soapenv:Envelope>");
out
}
pub fn serialize_sobject(out: &mut String, obj: &SObject) {
out.push_str("<urn:sObjects><sf:type>");
out.push_str(escape_text(&obj.sobject_type).as_ref());
out.push_str("</sf:type>");
for (name, value) in &obj.fields {
let Some(value) = value else {
continue;
};
out.push_str("<sf:");
out.push_str(name);
out.push('>');
out.push_str(escape_text(value).as_ref());
out.push_str("</sf:");
out.push_str(name);
out.push('>');
}
for field in &obj.fields_to_null {
out.push_str("<sf:fieldsToNull>");
out.push_str(escape_text(field).as_ref());
out.push_str("</sf:fieldsToNull>");
}
out.push_str("</urn:sObjects>");
}