use crate::{
SpopFrame,
frame::{FrameFlags, FramePayload, FrameType, Metadata},
frames::capabilities::FrameCapabilities,
types::TypedData,
};
use semver::Version;
use std::{borrow::Cow, collections::HashMap};
#[derive(Debug)]
pub struct AgentHello {
pub version: Version,
pub max_frame_size: u32,
pub capabilities: Vec<FrameCapabilities>,
}
impl SpopFrame for AgentHello {
fn frame_type(&self) -> &FrameType {
&FrameType::AgentHello
}
fn metadata(&self) -> Cow<'_, Metadata> {
Cow::Owned(Metadata {
flags: FrameFlags::new(true, false), stream_id: 0,
frame_id: 0,
})
}
fn payload(&self) -> FramePayload<'_> {
let mut map = HashMap::new();
let version_str = format!("{}.{}", self.version.major, self.version.minor);
map.insert("version".to_string(), TypedData::String(version_str));
map.insert(
"max-frame-size".to_string(),
TypedData::UInt32(self.max_frame_size),
);
let caps_string = self
.capabilities
.iter()
.map(std::string::ToString::to_string)
.collect::<Vec<_>>()
.join(",");
map.insert("capabilities".into(), TypedData::String(caps_string));
FramePayload::KVList(map)
}
}