use onlyne_proto::{RoleInfo, Welcome};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RoleSlice {
pub command: Vec<String>,
pub max_sessions: u32,
pub relay_required: Vec<String>,
pub relay_count: Option<u32>,
}
impl RoleSlice {
pub fn from_welcome(welcome: &Welcome) -> Self {
Self {
command: welcome.session_command.clone().unwrap_or_default(),
max_sessions: welcome.max_sessions,
relay_required: welcome.relay_required.clone().unwrap_or_default(),
relay_count: welcome.relay_count,
}
}
pub fn from_role_info(info: &RoleInfo, _current: &RoleSlice) -> Self {
Self {
command: info.session_command.clone(),
max_sessions: info.max_sessions,
relay_required: info.relay_required.clone().unwrap_or_default(),
relay_count: info.relay_count,
}
}
}
pub fn slice_diff(current: &RoleSlice, next: &RoleSlice) -> Vec<&'static str> {
let mut fields = Vec::new();
if current.command != next.command {
fields.push("session_command");
}
if current.max_sessions != next.max_sessions {
fields.push("max_sessions");
}
if current.relay_required != next.relay_required {
fields.push("relay_required");
}
if current.relay_count != next.relay_count {
fields.push("relay_count");
}
fields
}
pub fn apply_if_changed(
current: &RoleSlice,
next: RoleSlice,
) -> Option<(RoleSlice, Vec<&'static str>)> {
let fields = slice_diff(current, &next);
if fields.is_empty() {
None
} else {
Some((next, fields))
}
}
#[cfg(test)]
mod tests;