Skip to main content

bytesandbrains_core/
peer.rs

1use crate::{
2    address::{Address, AddressBook},
3    peer_id::PeerId,
4};
5
6/// A generic peer identity: PeerId + a page of network addresses.
7///
8/// This is the base peer type used across all protocols. Protocol-specific
9/// peer types that extend this with additional state live in their respective crates.
10#[derive(Clone, Debug, Hash, PartialEq, Eq)]
11pub struct Peer<A: Address> {
12    pub peer_id: PeerId,
13    pub addresses: AddressBook<A>,
14}
15
16impl<A: Address> Peer<A> {
17    pub fn new(peer_id: PeerId, addresses: AddressBook<A>) -> Self {
18        Self { peer_id, addresses }
19    }
20}
21
22impl<A: Address> std::fmt::Display for Peer<A> {
23    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
24        write!(f, "Peer({}, {})", self.peer_id, self.addresses.first().to_string())
25    }
26}
27
28#[cfg(test)]
29mod tests {
30    use super::*;
31
32    #[test]
33    fn test_peer_creation() {
34        let id = PeerId::from_data("test-peer");
35        let addrs = AddressBook::new("127.0.0.1:8080".to_string(), 5);
36        let peer = Peer::new(id, addrs);
37        assert_eq!(peer.peer_id, id);
38        assert_eq!(peer.addresses.len(), 1);
39    }
40
41    #[test]
42    fn test_peer_clone() {
43        let id = PeerId::from_data("test-peer");
44        let addrs = AddressBook::new("127.0.0.1:8080".to_string(), 5);
45        let peer1 = Peer::new(id, addrs);
46        let peer2 = peer1.clone();
47        assert_eq!(peer1, peer2);
48    }
49
50    #[test]
51    fn test_peer_equality() {
52        let id = PeerId::from_data("same");
53        let addrs1 = AddressBook::new("addr1".to_string(), 5);
54        let addrs2 = AddressBook::new("addr2".to_string(), 5);
55        let peer1 = Peer::new(id, addrs1);
56        let peer2 = Peer::new(id, addrs2);
57        // Different addresses means not equal
58        assert_ne!(peer1, peer2);
59    }
60
61    #[test]
62    fn test_peer_hash_as_key() {
63        use std::collections::HashMap;
64        let id = PeerId::from_data("peer1");
65        let addrs = AddressBook::new("addr".to_string(), 5);
66        let peer = Peer::new(id, addrs);
67        let mut map = HashMap::new();
68        map.insert(peer.clone(), 42);
69        assert_eq!(map.get(&peer), Some(&42));
70    }
71}