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
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// TODO(msardara): refactor this to use rust traits
16
17#[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        // test encode class
62        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        // test encode agent
72        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}