use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GlobalDescribe {
pub encoding: String,
pub max_batch_size: i32,
pub sobjects: Vec<GlobalSObjectDescribe>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GlobalSObjectDescribe {
pub activateable: bool,
pub mergeable: bool,
pub queryable: bool,
pub replicateable: bool,
pub retrieveable: bool,
pub searchable: bool,
pub triggerable: bool,
pub undeletable: bool,
pub name: String,
pub label: String,
pub label_plural: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub key_prefix: Option<String>,
pub custom: bool,
pub urls: HashMap<String, String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SObjectDescribe {
pub activateable: bool,
pub createable: bool,
pub custom: bool,
pub custom_setting: bool,
pub deletable: bool,
pub deprecated_and_hidden: bool,
pub feed_enabled: bool,
pub has_subtypes: bool,
pub is_subtype: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub key_prefix: Option<String>,
pub label: String,
pub label_plural: String,
pub layoutable: bool,
pub mergeable: bool,
pub mru_enabled: bool,
pub name: String,
pub queryable: bool,
pub replicateable: bool,
pub retrieveable: bool,
pub searchable: bool,
pub triggerable: bool,
pub undeletable: bool,
pub updateable: bool,
pub fields: Vec<FieldDescribe>,
pub child_relationships: Vec<ChildRelationship>,
pub record_type_infos: Vec<RecordTypeInfo>,
pub urls: HashMap<String, String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FieldDescribe {
pub aggregatable: bool,
pub auto_number: bool,
pub byte_length: i32,
pub calculated: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub calculated_formula: Option<String>,
pub cascade_delete: bool,
pub case_sensitive: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub compound_field_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub controller_name: Option<String>,
pub createable: bool,
pub custom: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_value: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_value_formula: Option<String>,
pub defaulted_on_create: bool,
pub dependent_picklist: bool,
pub deprecated_and_hidden: bool,
pub digits: i32,
pub display_location_in_decimal: bool,
pub encrypted: bool,
pub external_id: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub extra_type_info: Option<String>,
pub filterable: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub filtered_lookup_info: Option<FilteredLookupInfo>,
#[serde(skip_serializing_if = "Option::is_none")]
pub formula_treat_blanks_as: Option<String>,
pub groupable: bool,
pub high_scale_number: bool,
pub html_formatted: bool,
pub id_lookup: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub inline_help_text: Option<String>,
pub label: String,
pub length: i32,
#[serde(skip_serializing_if = "Option::is_none")]
pub mask: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mask_type: Option<String>,
pub name: String,
pub name_field: bool,
pub name_pointing: bool,
pub nillable: bool,
pub permissionable: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub picklist_values: Option<Vec<PicklistValue>>,
pub polymorphic_foreign_key: bool,
pub precision: i32,
pub query_by_distance: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub reference_target_field: Option<String>,
pub reference_to: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub relationship_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub relationship_order: Option<i32>,
pub restricted_delete: bool,
pub restricted_picklist: bool,
pub scale: i32,
#[serde(skip_serializing_if = "Option::is_none")]
pub search_prefixes_supported: Option<bool>,
pub soap_type: String,
pub sortable: bool,
#[serde(rename = "type")]
pub type_: FieldType,
pub unique: bool,
pub updateable: bool,
pub write_requires_master_read: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum FieldType {
String,
Picklist,
#[serde(rename = "multipicklist")]
Multipicklist,
Combobox,
Reference,
Base64,
Boolean,
Currency,
Textarea,
Int,
Double,
Percent,
Phone,
Id,
Date,
Datetime,
Time,
Url,
Email,
#[serde(rename = "encryptedstring")]
Encryptedstring,
#[serde(rename = "datacategorygroupreference")]
Datacategorygroupreference,
Location,
Address,
#[serde(rename = "anyType")]
AnyType,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PicklistValue {
pub active: bool,
pub default_value: bool,
pub label: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub valid_for: Option<String>,
pub value: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ChildRelationship {
pub cascade_delete: bool,
#[serde(rename = "childSObject")]
pub child_sobject: String,
pub deprecated_and_hidden: bool,
pub field: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub relationship_name: Option<String>,
pub restricted_delete: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RecordTypeInfo {
pub active: bool,
pub default_record_type_mapping: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub developer_name: Option<String>,
pub master: bool,
pub name: String,
pub record_type_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub urls: Option<HashMap<String, String>>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FilteredLookupInfo {
pub controlling_fields: Vec<String>,
pub dependent: bool,
pub optional_filter: bool,
}
#[cfg(test)]
mod tests {
use super::*;
use crate::test_support::Must;
use serde_json::json;
#[test]
fn picklist_value_accepts_salesforce_base64_valid_for_bitmap() {
let value: PicklistValue = serde_json::from_value(json!({
"active": true,
"defaultValue": false,
"label": "Prospect",
"validFor": "AAAAAgAA",
"value": "Prospect"
}))
.must();
assert_eq!(value.valid_for.as_deref(), Some("AAAAAgAA"));
}
}