use serde::{Deserialize, Serialize};
#[derive(Debug, Clone)]
pub struct QueryBuilder {
params: Vec<(String, String)>,
}
impl QueryBuilder {
pub fn new() -> Self {
Self { params: Vec::new() }
}
pub fn push(mut self, key: impl Into<String>, value: impl ToString) -> Self {
self.params.push((key.into(), value.to_string()));
self
}
pub fn build(self) -> Vec<(String, String)> {
self.params
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct JwtResponse {
pub jwt_token: String,
pub refresh_token: String,
}
#[derive(Debug, Clone)]
pub struct PhoneNumberAvailableQueryParams {
inner: QueryBuilder,
}
impl PhoneNumberAvailableQueryParams {
pub fn new() -> Self {
Self { inner: QueryBuilder::new() }
}
pub fn area_code(self, code: &str) -> Self {
Self { inner: self.inner.push("AreaCode", code) }
}
pub fn beta(self, beta: bool) -> Self {
Self { inner: self.inner.push("Beta", beta) }
}
pub fn contains(self, value: &str) -> Self {
Self {
inner: self.inner.push("Contains", value),
}
}
pub fn exclude_all_address_required(self, value: bool) -> Self {
Self {
inner: self.inner.push("ExcludeAllAddressRequired", value),
}
}
pub fn exclude_foreign_address_required(self, value: bool) -> Self {
Self {
inner: self.inner.push("ExcludeForeignAddressRequired", value),
}
}
pub fn exclude_local_address_required(self, value: bool) -> Self {
Self {
inner: self.inner.push("ExcludeLocalAddressRequired", value),
}
}
pub fn fax_enabled(self, enabled: bool) -> Self {
Self {
inner: self.inner.push("FaxEnabled", enabled),
}
}
pub fn in_region(self, region: &str) -> Self {
Self {
inner: self.inner.push("InRegion", region),
}
}
pub fn mms_enabled(self, enabled: bool) -> Self {
Self {
inner: self.inner.push("MmsEnabled", enabled),
}
}
pub fn sms_enabled(self, enabled: bool) -> Self {
Self {
inner: self.inner.push("SmsEnabled", enabled),
}
}
pub fn voice_enabled(self, enabled: bool) -> Self {
Self {
inner: self.inner.push("VoiceEnabled", enabled),
}
}
pub fn build(self) -> Vec<(String, String)> {
self.inner.build()
}
}
#[derive(Debug, Clone, Deserialize)]
pub struct PhoneNumbersAvailableResponse {
pub uri: String,
#[serde(rename = "available_phone_numbers")]
pub phone_numbers_available: Vec<PhoneNumberAvailable>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct PhoneNumberAvailable {
pub beta: bool,
pub capabilities: Capabilities,
pub friendly_name: String,
pub iso_country: String,
pub lata: Option<String>,
pub latitude: Option<f64>,
pub longitude: Option<f64>,
pub phone_number: String,
pub postal_code: Option<String>,
pub rate_center: String,
pub region: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct Capabilities {
pub voice: Option<bool>,
#[serde(rename = "SMS")]
pub sms: Option<bool>,
#[serde(rename = "MMS")]
pub mms: Option<bool>,
pub fax: Option<bool>,
}
#[derive(Debug, Clone)]
pub struct PhoneNumberOwnedFilterParams {
inner: QueryBuilder,
}
impl PhoneNumberOwnedFilterParams {
pub fn new() -> Self {
Self { inner: QueryBuilder::new() }
}
pub fn filter_name(self, name: &str) -> Self {
Self {
inner: self.inner.push("filter_name", name),
}
}
pub fn filter_number(self, number: &str) -> Self {
Self {
inner: self.inner.push("filter_number", number),
}
}
pub fn build(self) -> Vec<(String, String)> {
self.inner.build()
}
}
#[derive(Debug, Clone, Deserialize)]
pub struct PhoneNumbersOwnedResponse {
pub links: Links,
pub data: Vec<OwnedPhoneNumber>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct Links {
#[serde(rename = "self")]
pub self_field: String,
pub first: String,
pub next: Option<String>,
pub prev: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct OwnedPhoneNumber {
pub id: String,
pub number: String,
pub name: Option<String>,
pub call_handler: Option<String>,
pub call_receive_mode: Option<String>,
pub call_request_url: Option<String>,
pub call_request_method: Option<String>,
pub call_fallback_url: Option<String>,
pub call_fallback_method: Option<String>,
pub call_status_callback_url: Option<String>,
pub call_status_callback_method: Option<String>,
pub call_laml_application_id: Option<String>,
pub call_dialogflow_agent_id: Option<String>,
pub call_relay_topic: Option<String>,
pub call_relay_topic_status_callback_url: Option<String>,
pub call_relay_context: Option<String>,
pub call_relay_context_status_callback_url: Option<String>,
pub call_relay_application: Option<String>,
pub call_relay_connector_id: Option<String>,
pub call_sip_endpoint_id: Option<String>,
pub call_verto_resource: Option<String>,
pub call_video_room_id: Option<String>,
pub message_handler: Option<String>,
pub message_request_url: Option<String>,
pub message_request_method: Option<String>,
pub message_fallback_url: Option<String>,
pub message_fallback_method: Option<String>,
pub message_laml_application_id: Option<String>,
pub message_relay_topic: Option<String>,
pub message_relay_context: Option<String>,
pub message_relay_application: Option<String>,
pub capabilities: Vec<String>,
pub number_type: Option<String>,
pub e911_address_id: Option<String>,
pub created_at: Option<String>,
pub updated_at: Option<String>,
pub next_billed_at: Option<String>,
}
#[derive(Debug, Clone, Serialize)]
pub struct BuyPhoneNumberRequest {
pub number: String,
}
pub type BuyPhoneNumberResponse = OwnedPhoneNumber;
#[derive(Debug, Clone, Serialize)]
pub struct UpdatePhoneNumberRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub call_handler: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub call_receive_mode: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub call_request_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub call_request_method: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub call_fallback_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub call_fallback_method: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub call_status_callback_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub call_status_callback_method: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub call_laml_application_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub call_dialogflow_agent_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub call_relay_topic: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub call_relay_topic_status_callback_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub call_relay_script_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub call_relay_application: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub call_relay_connector_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub call_sip_endpoint_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub call_verto_resource: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub call_video_room_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub message_handler: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub message_request_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub message_request_method: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub message_fallback_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub message_fallback_method: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub message_laml_application_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub message_relay_topic: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub message_relay_application: Option<String>,
}
impl UpdatePhoneNumberRequest {
pub fn new() -> Self {
Self {
name: None,
call_handler: None,
call_receive_mode: None,
call_request_url: None,
call_request_method: None,
call_fallback_url: None,
call_fallback_method: None,
call_status_callback_url: None,
call_status_callback_method: None,
call_laml_application_id: None,
call_dialogflow_agent_id: None,
call_relay_topic: None,
call_relay_topic_status_callback_url: None,
call_relay_script_url: None,
call_relay_application: None,
call_relay_connector_id: None,
call_sip_endpoint_id: None,
call_verto_resource: None,
call_video_room_id: None,
message_handler: None,
message_request_url: None,
message_request_method: None,
message_fallback_url: None,
message_fallback_method: None,
message_laml_application_id: None,
message_relay_topic: None,
message_relay_application: None,
}
}
}
#[derive(Debug, Clone, Serialize)]
pub struct SmsMessage {
pub body: String,
pub from: String,
pub to: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct SmsResponse {
pub sid: String,
pub date_created: String,
pub date_updated: String,
pub date_sent: Option<String>,
pub account_sid: String,
pub to: String,
pub from: String,
pub messaging_service_sid: Option<String>,
pub body: String,
pub status: String,
pub num_segments: i32,
pub num_media: i32,
pub direction: String,
pub api_version: String,
pub price: Option<f64>,
pub price_unit: Option<String>,
pub error_code: Option<String>,
pub error_message: Option<String>,
pub uri: String,
pub subresource_uris: Option<SubresourceUris>,
}
impl SmsResponse {
pub fn get_status(&self) -> MessageStatus {
MessageStatus::from(self.status.as_str())
}
}
#[derive(Debug, Clone, Deserialize)]
pub struct SubresourceUris {
pub media: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MessageStatus {
Queued,
Sending,
Sent,
Delivered,
Failed,
Undelivered,
Unknown,
}
impl From<&str> for MessageStatus {
fn from(status: &str) -> Self {
match status.to_lowercase().as_str() {
"queued" => Self::Queued,
"sending" => Self::Sending,
"sent" => Self::Sent,
"delivered" => Self::Delivered,
"failed" => Self::Failed,
"undelivered" => Self::Undelivered,
_ => Self::Unknown,
}
}
}
impl std::fmt::Display for MessageStatus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let s = match self {
Self::Queued => "queued",
Self::Sending => "sending",
Self::Sent => "sent",
Self::Delivered => "delivered",
Self::Failed => "failed",
Self::Undelivered => "undelivered",
Self::Unknown => "unknown",
};
f.write_str(s)
}
}
#[derive(Debug, Clone, Deserialize)]
pub struct SubprojectResponse {
pub sid: String,
pub friendly_name: String,
pub status: String,
pub auth_token: String,
pub date_created: String,
pub date_updated: String,
#[serde(rename = "type")]
pub account_type: Option<String>,
pub owner_account_sid: Option<String>,
pub uri: Option<String>,
pub subproject: Option<bool>,
pub signing_key: Option<String>,
pub subresource_uris: SubprojectResourceUris,
}
#[derive(Debug, Clone, Deserialize)]
pub struct SubprojectResourceUris {
pub addresses: Option<String>,
pub available_phone_numbers: Option<String>,
pub applications: Option<String>,
pub authorized_connect_apps: Option<String>,
pub calls: Option<String>,
pub conferences: Option<String>,
pub connect_apps: Option<String>,
pub incoming_phone_numbers: Option<String>,
pub keys: Option<String>,
pub notifications: Option<String>,
pub outgoing_caller_ids: Option<String>,
pub queues: Option<String>,
pub recordings: Option<String>,
pub sandbox: Option<String>,
pub sip: Option<String>,
pub short_codes: Option<String>,
pub messages: Option<String>,
pub transcriptions: Option<String>,
pub usage: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct SubprojectsListResponse {
pub uri: Option<String>,
pub first_page_uri: String,
pub next_page_uri: Option<String>,
pub previous_page_uri: Option<String>,
pub page: Option<i32>,
pub page_size: Option<i32>,
pub accounts: Vec<SubprojectResponse>,
}
#[derive(Debug, Clone)]
pub struct SubprojectQueryParams {
inner: QueryBuilder,
}
impl SubprojectQueryParams {
pub fn new() -> Self {
Self { inner: QueryBuilder::new() }
}
pub fn friendly_name(self, friendly_name: &str) -> Self {
Self {
inner: self.inner.push("FriendlyName", friendly_name),
}
}
pub fn status(self, status: &str) -> Self {
Self { inner: self.inner.push("Status", status) }
}
pub fn build(self) -> Vec<(String, String)> {
self.inner.build()
}
}
#[derive(Debug, Clone, Deserialize)]
pub struct SubprojectPhoneNumbersResponse {
pub uri: String,
pub first_page_uri: String,
pub next_page_uri: Option<String>,
pub previous_page_uri: Option<String>,
pub page: i32,
pub page_size: i32,
pub incoming_phone_numbers: Vec<SubprojectPhoneNumber>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct SubprojectPhoneNumber {
pub sid: String,
pub account_sid: String,
pub friendly_name: String,
pub phone_number: String,
pub voice_url: Option<String>,
pub voice_method: Option<String>,
pub voice_fallback_url: Option<String>,
pub voice_fallback_method: Option<String>,
pub status_callback: Option<String>,
pub status_callback_method: Option<String>,
pub voice_caller_id_lookup: Option<bool>,
pub voice_application_sid: Option<String>,
pub date_created: String,
pub date_updated: String,
pub sms_url: Option<String>,
pub sms_method: Option<String>,
pub sms_fallback_url: Option<String>,
pub sms_fallback_method: Option<String>,
pub sms_application_sid: Option<String>,
pub capabilities: PhoneNumberCapabilities,
pub beta: bool,
pub uri: String,
pub trunk_sid: Option<String>,
pub emergency_status: Option<String>,
pub emergency_address_sid: Option<String>,
pub emergency_address_status: Option<String>,
pub status: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct PhoneNumberCapabilities {
pub voice: bool,
pub sms: bool,
pub mms: bool,
pub fax: bool,
}
#[derive(Debug, Clone, Deserialize)]
pub struct PhoneLookupResponse {
pub country_code_number: Option<i32>,
pub national_number: Option<String>,
pub possible_number: Option<bool>,
pub valid_number: Option<bool>,
pub national_number_formatted: Option<String>,
pub international_number_formatted: Option<String>,
pub e164: Option<String>,
pub location: Option<String>,
pub country_code: String,
pub timezones: Option<Vec<String>>,
pub number_type: Option<String>,
pub carrier: Option<CarrierInfo>,
pub caller_name: Option<CallerNameInfo>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct CarrierInfo {
pub mobile_country_code: Option<String>,
pub mobile_network_code: Option<String>,
pub name: Option<String>,
#[serde(rename = "type")]
pub kind: Option<String>,
pub error_code: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct CallerNameInfo {
pub caller_name: Option<String>,
pub caller_type: Option<String>,
pub error_code: Option<String>,
}
#[derive(Debug, Clone, Copy)]
pub enum LookupKind {
Basic,
Carrier,
CallerName,
}
impl LookupKind {
pub(crate) fn as_query(self) -> Option<(&'static str, &'static str)> {
match self {
Self::Basic => None,
Self::Carrier => Some(("Type", "carrier")),
Self::CallerName => Some(("Type", "caller-name")),
}
}
}