use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ParsedAgentId {
pub agent_name: String,
pub team_name: String,
}
pub fn format_agent_id(agent_name: &str, team_name: &str) -> String {
format!("{}@{}", agent_name, team_name)
}
pub fn parse_agent_id(agent_id: &str) -> Option<ParsedAgentId> {
let at_index = agent_id.find('@')?;
Some(ParsedAgentId {
agent_name: agent_id[..at_index].to_string(),
team_name: agent_id[at_index + 1..].to_string(),
})
}
pub fn generate_request_id(request_type: &str, agent_id: &str) -> String {
let timestamp = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_millis();
format!("{}-{}@{}", request_type, timestamp, agent_id)
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ParsedRequestId {
pub request_type: String,
pub timestamp: u64,
pub agent_id: String,
}
pub fn parse_request_id(request_id: &str) -> Option<ParsedRequestId> {
let at_index = request_id.find('@')?;
let prefix = &request_id[..at_index];
let agent_id = &request_id[at_index + 1..];
let last_dash_index = prefix.rfind('-')?;
let request_type = prefix[..last_dash_index].to_string();
let timestamp_str = &prefix[last_dash_index + 1..];
let timestamp: u64 = timestamp_str.parse().ok()?;
Some(ParsedRequestId {
request_type,
timestamp,
agent_id: agent_id.to_string(),
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_format_agent_id() {
let id = format_agent_id("team-lead", "my-project");
assert_eq!(id, "team-lead@my-project");
}
#[test]
fn test_parse_agent_id() {
let parsed = parse_agent_id("researcher@my-project").unwrap();
assert_eq!(parsed.agent_name, "researcher");
assert_eq!(parsed.team_name, "my-project");
assert!(parse_agent_id("invalid").is_none());
}
#[test]
fn test_generate_and_parse_request_id() {
let agent_id = "test@project";
let request_id = generate_request_id("shutdown", agent_id);
let parsed = parse_request_id(&request_id).unwrap();
assert_eq!(parsed.request_type, "shutdown");
assert_eq!(parsed.agent_id, agent_id);
assert!(parsed.timestamp > 0);
}
}