use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(tag = "type")]
#[non_exhaustive]
pub enum AriEvent {
StasisStart {
channel: Channel,
#[serde(default)]
args: Vec<String>,
#[serde(default)]
replace_channel: Option<Channel>,
},
StasisEnd { channel: Channel },
ChannelCreated { channel: Channel },
ChannelDestroyed {
channel: Channel,
cause: i32,
cause_txt: String,
},
ChannelStateChange { channel: Channel },
ChannelDtmfReceived {
channel: Channel,
digit: String,
duration_ms: u32,
},
ChannelHangupRequest { channel: Channel },
ChannelVarset {
channel: Option<Channel>,
variable: String,
value: String,
},
BridgeCreated { bridge: Bridge },
BridgeDestroyed { bridge: Bridge },
ChannelEnteredBridge { bridge: Bridge, channel: Channel },
ChannelLeftBridge { bridge: Bridge, channel: Channel },
PlaybackStarted { playback: Playback },
PlaybackFinished { playback: Playback },
RecordingStarted { recording: LiveRecording },
RecordingFinished { recording: LiveRecording },
ChannelCallerId {
channel: Channel,
caller_presentation: i32,
caller_presentation_txt: String,
},
ChannelConnectedLine { channel: Channel },
ChannelDialplan {
channel: Channel,
dialplan_app: String,
dialplan_app_data: String,
},
ChannelHold {
channel: Channel,
#[serde(default)]
musicclass: Option<String>,
},
ChannelUnhold { channel: Channel },
ChannelTalkingStarted { channel: Channel },
ChannelTalkingFinished { channel: Channel, duration: i32 },
ChannelToneDetected { channel: Channel },
ChannelTransfer {
channel: Channel,
#[serde(default)]
refer_to: Option<Box<ReferTo>>,
#[serde(default)]
referred_by: Option<Box<ReferredBy>>,
#[serde(default)]
state: Option<String>,
},
ChannelUserevent {
#[serde(default)]
channel: Option<Channel>,
#[serde(default)]
bridge: Option<Bridge>,
#[serde(default)]
endpoint: Option<Endpoint>,
eventname: String,
#[serde(default)]
userevent: serde_json::Value,
},
Dial {
peer: Channel,
#[serde(default)]
caller: Option<Channel>,
#[serde(default)]
forwarded: Option<Channel>,
dialstatus: String,
#[serde(default)]
dialstring: Option<String>,
#[serde(default)]
forward: Option<String>,
},
BridgeAttendedTransfer {
transferer_first_leg: Channel,
transferer_second_leg: Channel,
result: String,
destination_type: String,
is_external: bool,
#[serde(default)]
transferee: Option<Box<Channel>>,
#[serde(default)]
transfer_target: Option<Box<Channel>>,
#[serde(default)]
replace_channel: Option<Box<Channel>>,
#[serde(default)]
transferer_first_leg_bridge: Option<Bridge>,
#[serde(default)]
transferer_second_leg_bridge: Option<Bridge>,
#[serde(default)]
destination_bridge: Option<String>,
#[serde(default)]
destination_application: Option<String>,
#[serde(default)]
destination_link_first_leg: Option<Box<Channel>>,
#[serde(default)]
destination_link_second_leg: Option<Box<Channel>>,
#[serde(default)]
destination_threeway_channel: Option<Box<Channel>>,
#[serde(default)]
destination_threeway_bridge: Option<Bridge>,
},
BridgeBlindTransfer {
channel: Channel,
exten: String,
context: String,
result: String,
is_external: bool,
#[serde(default)]
bridge: Option<Bridge>,
#[serde(default)]
transferee: Option<Channel>,
#[serde(default)]
replace_channel: Option<Channel>,
},
BridgeMerged { bridge: Bridge, bridge_from: Bridge },
BridgeVideoSourceChanged {
bridge: Bridge,
#[serde(default)]
old_video_source_id: Option<String>,
},
ContactStatusChange {
contact_info: ContactInfo,
endpoint: Endpoint,
},
DeviceStateChanged { device_state: DeviceState },
EndpointStateChange { endpoint: Endpoint },
PeerStatusChange { endpoint: Endpoint, peer: Peer },
PlaybackContinuing { playback: Playback },
RecordingFailed { recording: LiveRecording },
ApplicationMoveFailed {
channel: Channel,
destination: String,
#[serde(default)]
args: Vec<String>,
},
ApplicationRegistered {},
ApplicationReplaced {},
ApplicationUnregistered {},
TextMessageReceived {
message: TextMessage,
#[serde(default)]
endpoint: Option<Endpoint>,
},
RESTResponse {
status_code: i32,
reason_phrase: String,
uri: String,
request_id: String,
transaction_id: String,
#[serde(default)]
content_type: Option<String>,
#[serde(default)]
message_body: Option<String>,
},
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct AriMessage {
#[serde(default)]
pub application: String,
#[serde(default)]
pub timestamp: String,
#[serde(default)]
pub asterisk_id: Option<String>,
#[serde(flatten)]
pub event: AriEvent,
}
impl asterisk_rs_core::event::Event for AriMessage {}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContactInfo {
pub uri: String,
pub contact_status: String,
pub aor: String,
#[serde(default)]
pub roundtrip_usec: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Peer {
pub peer_status: String,
#[serde(default)]
pub address: Option<String>,
#[serde(default)]
pub port: Option<String>,
#[serde(default)]
pub cause: Option<String>,
#[serde(default)]
pub time: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Endpoint {
pub technology: String,
pub resource: String,
#[serde(default)]
pub state: Option<String>,
#[serde(default)]
pub channel_ids: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeviceState {
pub name: String,
pub state: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TextMessage {
pub from: String,
pub to: String,
pub body: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReferTo {
#[serde(default)]
pub destination_channel: Option<Channel>,
#[serde(default)]
pub connected_channel: Option<Channel>,
#[serde(default)]
pub bridge: Option<Bridge>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReferredBy {
pub source_channel: Channel,
#[serde(default)]
pub connected_channel: Option<Channel>,
#[serde(default)]
pub bridge: Option<Bridge>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Channel {
pub id: String,
pub name: String,
pub state: String,
#[serde(default)]
pub caller: CallerId,
#[serde(default)]
pub connected: CallerId,
#[serde(default)]
pub dialplan: DialplanCep,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct CallerId {
#[serde(default)]
pub name: String,
#[serde(default)]
pub number: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct DialplanCep {
#[serde(default)]
pub context: String,
#[serde(default)]
pub exten: String,
#[serde(default)]
pub priority: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Bridge {
pub id: String,
pub technology: String,
pub bridge_type: String,
#[serde(default)]
pub channels: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Playback {
pub id: String,
pub media_uri: String,
pub state: String,
#[serde(default)]
pub target_uri: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LiveRecording {
pub name: String,
pub format: String,
pub state: String,
#[serde(default)]
pub target_uri: String,
}