streaming_http_range_client/
http_range.rs1use 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}