shared/
lib.rs

1use std::{
2    error::Error,
3    net::SocketAddr,
4    time::{SystemTime, UNIX_EPOCH},
5};
6
7use messages::Message;
8use tokio::net::UdpSocket;
9
10pub mod messages;
11
12#[derive(Clone)]
13pub struct Transfer {
14    pub file_haver: SocketAddr,
15    pub file_name: String,
16    pub file_len: u64,
17    pub last_updated: u64,
18}
19
20impl Transfer {
21    pub fn new(file_haver: SocketAddr, file_name: String, file_len: u64) -> Self {
22        let last_updated = SystemTime::now()
23            .duration_since(UNIX_EPOCH)
24            .unwrap()
25            .as_secs();
26        Self {
27            file_haver,
28            file_name,
29            file_len,
30            last_updated,
31        }
32    }
33
34    pub fn update(&mut self) {
35        let last_updated = SystemTime::now()
36            .duration_since(UNIX_EPOCH)
37            .unwrap()
38            .as_secs();
39
40        self.last_updated = last_updated;
41    }
42
43    pub fn has_expired(&self) -> bool {
44        let now = SystemTime::now()
45            .duration_since(UNIX_EPOCH)
46            .unwrap()
47            .as_secs();
48
49        self.last_updated + 10 < now
50    }
51}
52
53pub async fn send_msg<T: Message>(
54    sock: &UdpSocket,
55    msg: &T,
56    target: &SocketAddr,
57) -> Result<(), Box<dyn Error>> {
58    let msg_raw = msg.to_raw();
59    sock.send_to(msg_raw.as_slice(), target).await?;
60    Ok(())
61}