use bon::Builder;
use getset::{CopyGetters, Getters, MutGetters, Setters};
use serde::{Deserialize, Serialize};
pub const MAX_CHARS: usize = 280;
#[derive(Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize, Deserialize, Builder, CopyGetters, Getters, MutGetters, Setters)]
#[serde(rename_all = "camelCase")]
pub struct PostalAddress {
#[serde(default)]
#[builder(into)]
#[getset(get_copy = "pub", get_mut = "pub", set = "pub")]
pub revision: Option<usize>,
#[serde(default)]
#[builder(into)]
#[getset(get = "pub", get_mut = "pub", set = "pub")]
pub region_code: Option<String>,
#[serde(default)]
#[builder(into)]
#[getset(get = "pub", get_mut = "pub", set = "pub")]
pub language_code: Option<String>,
#[serde(default)]
#[builder(into)]
#[getset(get = "pub", get_mut = "pub", set = "pub")]
pub postal_code: Option<String>,
#[serde(default)]
#[builder(into)]
#[getset(get = "pub", get_mut = "pub", set = "pub")]
pub sorting_code: Option<String>,
#[serde(default)]
#[builder(into)]
#[getset(get = "pub", get_mut = "pub", set = "pub")]
pub administrative_area: Option<String>,
#[serde(default)]
#[builder(into)]
#[getset(get = "pub", get_mut = "pub", set = "pub")]
pub locality: Option<String>,
#[serde(default)]
#[builder(into)]
#[getset(get = "pub", get_mut = "pub", set = "pub")]
pub sublocality: Option<String>,
#[serde(default)]
#[builder(default = Vec::new())]
#[builder(with = |v: Vec<impl ToString>| v.into_iter().map(|s| s.to_string()).collect::<Vec<String>>())]
#[getset(get = "pub", get_mut = "pub", set = "pub")]
pub address_lines: Vec<String>,
#[serde(default)]
#[builder(default = Vec::new())]
#[builder(with = |v: Vec<impl ToString>| v.into_iter().map(|s| s.to_string()).collect::<Vec<String>>())]
#[getset(get = "pub", get_mut = "pub", set = "pub")]
pub recipients: Vec<String>,
#[serde(default)]
#[builder(into)]
#[getset(get = "pub", get_mut = "pub", set = "pub")]
pub organization: Option<String>,
}
impl PostalAddress {
#[must_use] pub fn len(&self) -> usize {
let mut len: usize = 0;
len += self.revision.as_ref().map_or(0, |int| int.to_string().len());
len += self.region_code.as_ref().map_or(0, String::len);
len += self.language_code.as_ref().map_or(0, String::len);
len += self.postal_code.as_ref().map_or(0, String::len);
len += self.sorting_code.as_ref().map_or(0, String::len);
len += self.administrative_area.as_ref().map_or(0, String::len);
len += self.locality.as_ref().map_or(0, String::len);
len += self.sublocality.as_ref().map_or(0, String::len);
len += self.address_lines.iter().map(String::len).sum::<usize>();
len += self.recipients.iter().map(String::len).sum::<usize>();
len += self.organization.as_ref().map_or(0, String::len);
len
}
#[must_use] pub fn is_empty(&self) -> bool { self.len() == 0 }
}