streaming_http_range_client/
http_range.rs

1use core::ops::{Range, RangeFrom};
2
3#[derive(Debug, Clone)]
4pub enum HttpRange {
5    Range(Range<u64>),
6    RangeFrom(RangeFrom<u64>),
7}
8
9impl HttpRange {
10    pub fn start(&self) -> u64 {
11        match self {
12            Self::Range(range) => range.start,
13            Self::RangeFrom(range) => range.start,
14        }
15    }
16
17    pub fn end(&self) -> Option<u64> {
18        match self {
19            Self::Range(range) => Some(range.end),
20            Self::RangeFrom(_) => None,
21        }
22    }
23
24    pub fn with_end(self, end: Option<u64>) -> Self {
25        match end {
26            Some(end) => Self::Range(self.start()..end),
27            None => Self::RangeFrom(self.start()..),
28        }
29    }
30
31    pub fn split(&mut self, new_end: u64) -> Self {
32        assert!(
33            new_end >= self.start(),
34            "new_end is before where we already start (rewinding?) new_end: {}, start: {}",
35            new_end,
36            self.start()
37        );
38        match self {
39            Self::Range(range) => {
40                assert!(new_end <= range.end);
41                let old_end = range.end;
42                range.end = new_end;
43                Self::Range(new_end..old_end)
44            }
45            Self::RangeFrom(range) => {
46                *self = Self::Range(range.start..new_end);
47                Self::RangeFrom(new_end..)
48            }
49        }
50    }
51}
52
53impl From<Range<u64>> for HttpRange {
54    fn from(value: Range<u64>) -> Self {
55        Self::Range(value)
56    }
57}
58
59impl From<RangeFrom<u64>> for HttpRange {
60    fn from(value: RangeFrom<u64>) -> Self {
61        Self::RangeFrom(value)
62    }
63}