use crate::protocol::sd;
use crate::protocol::{self, MessageId, sd::Flags};
pub struct OfferedEndpoint {
pub service_id: u16,
pub instance_id: u16,
pub major_version: u8,
pub minor_version: u32,
pub endpoint: Option<crate::NetEndpoint>,
pub is_offer: bool,
}
pub trait EncodeExt: automotive_wire_codec::Encode {
#[cfg(feature = "std")]
fn encode_to_vec(&self) -> Result<std::vec::Vec<u8>, Self::Error> {
let mut buf = std::vec![0u8; self.encoded_size()?];
let mut cursor: &mut [u8] = &mut buf;
self.encode(&mut cursor)?;
Ok(buf)
}
}
impl<T: automotive_wire_codec::Encode> EncodeExt for T {}
pub trait PayloadWireFormat:
automotive_wire_codec::Encode<Error = protocol::Error> + core::fmt::Debug + Send + Sized + Sync
{
type SdHeader: automotive_wire_codec::Encode<Error = protocol::Error>
+ Clone
+ core::fmt::Debug
+ Eq
+ Send
+ Sync;
fn message_id(&self) -> MessageId;
fn as_sd_header(&self) -> Option<&Self::SdHeader>;
fn from_payload_bytes(message_id: MessageId, payload: &[u8]) -> Result<Self, protocol::Error>;
fn new_sd_payload(header: &Self::SdHeader) -> Self;
fn sd_flags(&self) -> Option<Flags>;
#[allow(clippy::too_many_arguments)]
fn new_subscription_sd_header(
service_id: u16,
instance_id: u16,
major_version: u8,
ttl: u32,
event_group_id: u16,
client_ip: core::net::Ipv4Addr,
protocol: sd::TransportProtocol,
client_port: u16,
reboot_flag: sd::RebootFlag,
) -> Self::SdHeader;
fn set_reboot_flag(_header: &mut Self::SdHeader, _reboot: sd::RebootFlag) {}
fn for_each_offered_endpoint<F>(&self, _f: F)
where
F: FnMut(OfferedEndpoint),
{
}
fn for_each_service_instance<F>(&self, _f: F)
where
F: FnMut(u16, u16),
{
}
#[cfg(feature = "std")]
fn offered_endpoints(&self) -> std::vec::Vec<OfferedEndpoint> {
let mut out = std::vec::Vec::new();
self.for_each_offered_endpoint(|ep| out.push(ep));
out
}
#[cfg(feature = "std")]
fn service_instances(&self) -> std::vec::Vec<(u16, u16)> {
let mut out = std::vec::Vec::new();
self.for_each_service_instance(|svc, inst| out.push((svc, inst)));
out
}
}