Skip to main content

irontide_core/
file_priority.rs

1use serde::{Deserialize, Serialize};
2
3/// Per-file download priority.
4///
5/// Matches libtorrent's priority scale. `Skip` means "do not download".
6/// `PartialOrd`/`Ord` ordering: Skip < Low < Normal < High.
7#[derive(
8    Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize,
9)]
10#[repr(u8)]
11pub enum FilePriority {
12    /// Do not download this file.
13    Skip = 0,
14    /// Low download priority.
15    Low = 1,
16    /// Default download priority.
17    #[default]
18    Normal = 4,
19    /// High download priority.
20    High = 7,
21}
22
23impl From<u8> for FilePriority {
24    fn from(v: u8) -> Self {
25        match v {
26            0 => Self::Skip,
27            1 => Self::Low,
28            7 => Self::High,
29            _ => Self::Normal,
30        }
31    }
32}
33
34#[cfg(test)]
35mod tests {
36    use super::*;
37
38    #[test]
39    fn default_is_normal() {
40        assert_eq!(FilePriority::default(), FilePriority::Normal);
41    }
42
43    #[test]
44    fn ordering_skip_less_than_high() {
45        assert!(FilePriority::Skip < FilePriority::Low);
46        assert!(FilePriority::Low < FilePriority::Normal);
47        assert!(FilePriority::Normal < FilePriority::High);
48    }
49
50    #[test]
51    fn from_u8_known_values() {
52        assert_eq!(FilePriority::from(0), FilePriority::Skip);
53        assert_eq!(FilePriority::from(1), FilePriority::Low);
54        assert_eq!(FilePriority::from(4), FilePriority::Normal);
55        assert_eq!(FilePriority::from(7), FilePriority::High);
56    }
57
58    #[test]
59    fn from_u8_unknown_defaults_to_normal() {
60        assert_eq!(FilePriority::from(2), FilePriority::Normal);
61        assert_eq!(FilePriority::from(255), FilePriority::Normal);
62    }
63
64    #[test]
65    fn repr_u8_round_trip() {
66        let p = FilePriority::High;
67        let v = p as u8;
68        assert_eq!(v, 7);
69        assert_eq!(FilePriority::from(v), p);
70    }
71
72    #[test]
73    fn serde_round_trip() {
74        let p = FilePriority::Low;
75        let encoded = irontide_bencode::to_bytes(&p).unwrap();
76        let decoded: FilePriority = irontide_bencode::from_bytes(&encoded).unwrap();
77        assert_eq!(p, decoded);
78    }
79}