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