use std::collections::HashMap;
use crate::config::codec::Codec;
use super::{MemoryRegion, Party};
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
#[serde(deny_unknown_fields)]
pub struct Ipc {
#[serde(default, rename = "channel")]
pub channels: Vec<IpcChannel>,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct IpcChannel {
pub name: String,
pub doorbell: String,
pub pattern: IpcPattern,
pub config: IpcChannelConfig,
pub mtu: u32,
pub primary: Party,
pub secondary: Party,
#[serde(default, rename = "party")]
pub endpoints: HashMap<Party, IpcEndpoint>,
#[serde(default)]
pub codec: Codec,
}
impl IpcChannel {
pub const fn memory(&self) -> Option<MemoryRegion> {
self.config.memory
}
pub const fn cache(&self) -> bool {
self.config.cache
}
pub const fn ack(&self) -> bool {
self.config.ack
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum IpcPattern {
Memory,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
#[serde(deny_unknown_fields)]
pub struct IpcChannelConfig {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub memory: Option<MemoryRegion>,
#[serde(default)]
pub cache: bool,
#[serde(default)]
pub ack: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
#[serde(deny_unknown_fields)]
pub struct IpcEndpoint {
pub chan: u32,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ack_chan: Option<u32>,
#[serde(rename = "type")]
pub r#type: String,
}