agp_datapath/messages/
encoder.rs

1// SPDX-FileCopyrightText: Copyright (c) 2025 Cisco and/or its affiliates.
2// SPDX-License-Identifier: Apache-2.0
3
4use 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// TODO(msardara): refactor this to use rust traits
14
15#[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        // test encode class
60        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        // test encode agent
70        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}