use super::DateTime;
use serde::{Deserialize, Serialize};
mod status;
pub use status::Status;
mod scope;
pub use scope::Scope;
mod message_type;
pub use message_type::MessageType;
mod category;
pub use category::Category;
mod urgency;
pub use urgency::Urgency;
mod severity;
pub use severity::Severity;
mod certainty;
pub use certainty::Certainty;
pub mod map;
pub use map::Map;
use crate::delimited_items::Items;
use crate::geo::{Circle, Polygon};
use crate::id::Id;
use crate::language::Language;
use crate::references::References;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename = "{http://www.incident.com/cap/1.0}cap:alert")]
pub struct Alert {
#[serde(rename = "{http://www.incident.com/cap/1.0}cap:identifier")]
pub identifier: Id,
#[serde(rename = "{http://www.incident.com/cap/1.0}cap:sender")]
pub sender: Id,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:password",
skip_serializing_if = "Option::is_none"
)]
pub password: Option<String>,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:source",
skip_serializing_if = "Option::is_none"
)]
pub source: Option<String>,
#[serde(rename = "{http://www.incident.com/cap/1.0}cap:sent")]
pub sent: DateTime,
#[serde(rename = "{http://www.incident.com/cap/1.0}cap:status")]
pub status: Status,
#[serde(rename = "{http://www.incident.com/cap/1.0}cap:scope")]
pub scope: Scope,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:restriction",
skip_serializing_if = "Option::is_none"
)]
pub restriction: Option<String>,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:addresses",
skip_serializing_if = "Option::is_none"
)]
pub addresses: Option<Items>,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:code",
default,
skip_serializing_if = "Vec::is_empty"
)]
pub codes: Vec<String>,
#[serde(rename = "{http://www.incident.com/cap/1.0}cap:msgType")]
pub message_type: MessageType,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:note",
skip_serializing_if = "Option::is_none"
)]
pub note: Option<String>,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:references",
skip_serializing_if = "Option::is_none"
)]
pub references: Option<References>,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:incidents",
skip_serializing_if = "Option::is_none"
)]
pub incidents: Option<Items>,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:info",
default,
skip_serializing_if = "Vec::is_empty"
)]
pub info: Vec<Info>,
}
#[derive(Serialize, Deserialize)]
struct AlertDocument {
#[serde(rename = "{http://www.incident.com/cap/1.0}cap:alert")]
alert: Alert,
}
impl std::str::FromStr for Alert {
type Err = xml_serde::Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
xml_serde::from_str::<AlertDocument>(s).map(|doc| doc.alert)
}
}
impl std::fmt::Display for Alert {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
xml_serde::to_string(self)
.map_err(|_| std::fmt::Error)
.and_then(|str| f.write_str(&str))
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename = "{http://www.incident.com/cap/1.0}cap:info")]
pub struct Info {
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:language",
skip_serializing_if = "Language::is_empty"
)]
pub language: Language,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:category",
skip_serializing_if = "Vec::is_empty"
)]
pub categories: Vec<Category>,
#[serde(rename = "{http://www.incident.com/cap/1.0}cap:event")]
pub event: String,
#[serde(rename = "{http://www.incident.com/cap/1.0}cap:urgency")]
pub urgency: Urgency,
#[serde(rename = "{http://www.incident.com/cap/1.0}cap:severity")]
pub severity: Severity,
#[serde(rename = "{http://www.incident.com/cap/1.0}cap:certainty")]
pub certainty: Certainty,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:audience",
skip_serializing_if = "Option::is_none"
)]
pub audience: Option<String>,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:eventCode",
skip_serializing_if = "Map::is_empty"
)]
pub event_codes: Map,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:effective",
skip_serializing_if = "Option::is_none"
)]
pub effective: Option<DateTime>,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:onset",
skip_serializing_if = "Option::is_none"
)]
pub onset: Option<DateTime>,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:expires",
skip_serializing_if = "Option::is_none"
)]
pub expires: Option<DateTime>,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:senderName",
skip_serializing_if = "Option::is_none"
)]
pub sender_name: Option<String>,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:headline",
skip_serializing_if = "Option::is_none"
)]
pub headline: Option<String>,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:description",
skip_serializing_if = "Option::is_none"
)]
pub description: Option<String>,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:instruction",
skip_serializing_if = "Option::is_none"
)]
pub instruction: Option<String>,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:web",
deserialize_with = "crate::url::deserialize",
skip_serializing_if = "Option::is_none",
default
)]
pub web: Option<url::Url>,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:contact",
skip_serializing_if = "Option::is_none"
)]
pub contact: Option<String>,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:parameter",
skip_serializing_if = "Map::is_empty"
)]
pub parameters: Map,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:resource",
default,
skip_serializing_if = "Vec::is_empty"
)]
pub resources: Vec<Resource>,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:area",
default,
skip_serializing_if = "Vec::is_empty"
)]
pub areas: Vec<Area>,
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
#[serde(rename = "{http://www.incident.com/cap/1.0}cap:resource")]
pub struct Resource {
#[serde(rename = "{http://www.incident.com/cap/1.0}cap:resourceDesc")]
pub description: String,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:mimeType",
skip_serializing_if = "Option::is_none"
)]
pub mime_type: Option<String>,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:size",
skip_serializing_if = "Option::is_none"
)]
pub size: Option<u64>,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:uri",
deserialize_with = "crate::url::deserialize",
skip_serializing_if = "Option::is_none",
default
)]
pub uri: Option<url::Url>,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:digest",
skip_serializing_if = "Option::is_none"
)]
pub digest: Option<crate::digest::Sha1>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename = "{http://www.incident.com/cap/1.0}cap:area")]
pub struct Area {
#[serde(rename = "{http://www.incident.com/cap/1.0}cap:areaDesc")]
pub description: String,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:polygon",
default,
deserialize_with = "Polygon::deserialize_optional",
skip_serializing_if = "Vec::is_empty"
)]
pub polygons: Vec<Polygon>,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:circle",
default,
skip_serializing_if = "Vec::is_empty"
)]
pub circles: Vec<Circle>,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:geocode",
skip_serializing_if = "Map::is_empty"
)]
pub geocode: Map,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:altitude",
skip_serializing_if = "Option::is_none"
)]
pub altitude: Option<f64>,
#[serde(
rename = "{http://www.incident.com/cap/1.0}cap:ceiling",
skip_serializing_if = "Option::is_none"
)]
pub ceiling: Option<f64>,
}
#[cfg(test)]
mod tests;