agp_datapath/messages/
encoder.rs1use std::hash::{DefaultHasher, Hash, Hasher};
5
6pub const DEFAULT_AGENT_ID: u64 = 0;
7
8#[derive(Hash, Eq, PartialEq, Debug, Clone, Default)]
9pub struct AgentClass {
10 pub organization: u64,
11 pub namespace: u64,
12 pub agent_class: u64,
13}
14
15#[derive(Hash, Eq, PartialEq, Debug, Clone, Default)]
18pub struct Agent {
19 pub agent_class: AgentClass,
20 pub agent_id: u64,
21}
22
23fn calculate_hash<T: Hash + ?Sized>(t: &T) -> u64 {
24 let mut s = DefaultHasher::new();
25 t.hash(&mut s);
26 s.finish()
27}
28
29pub fn encode_agent_class(organization: &str, namespace: &str, agent_class: &str) -> AgentClass {
30 AgentClass {
31 organization: calculate_hash(organization),
32 namespace: calculate_hash(namespace),
33 agent_class: calculate_hash(agent_class),
34 }
35}
36pub fn encode_agent_from_string(
37 organization: &str,
38 namespace: &str,
39 agent_class: &str,
40 agent_id: u64,
41) -> Agent {
42 Agent {
43 agent_class: encode_agent_class(organization, namespace, agent_class),
44 agent_id,
45 }
46}
47
48pub fn encode_agent_from_class(class: AgentClass, agent_id: u64) -> Agent {
49 Agent {
50 agent_class: class,
51 agent_id,
52 }
53}
54
55#[cfg(test)]
56mod tests {
57 use super::*;
58
59 #[test]
60 fn test_name_encoder() {
61 let encode1 = encode_agent_class("Cisco", "Default", "Agent_ONE");
63 let encode2 = encode_agent_class("Cisco", "Default", "Agent_ONE");
64 assert_eq!(encode1, encode2);
65 let encode3 = encode_agent_class("not_Cisco", "not_Default", "not_Agent_ONE");
66 assert_ne!(encode1, encode3);
67
68 let encode4 = encode_agent_class("Cisco", "Cisco", "Agent_ONE");
69 assert_eq!(encode4.organization, encode4.namespace);
70
71 let class = encode_agent_class("Cisco", "Default", "Agent_ONE");
73 let agent = encode_agent_from_string("Cisco", "Default", "Agent_ONE", 1);
74 assert_eq!(class, agent.agent_class);
75 let agent_from_class = encode_agent_from_class(class.clone(), 1);
76 assert_eq!(agent, agent_from_class);
77 }
78}