gistools/parsers/read/
fetch.rs1use crate::{parsers::Reader, util::fetch_url};
2use core::cell::RefCell;
3
4#[derive(Debug, Clone)]
43pub struct FetchReader {
44 path: String,
45 range_requests: bool,
46 cursor: RefCell<u64>,
47}
48impl FetchReader {
49 pub fn new(path: String, range_requests: bool) -> Self {
55 Self { path, range_requests, cursor: 0.into() }
56 }
57}
58impl Reader for FetchReader {
59 fn len(&self) -> u64 {
60 0
61 }
62
63 fn uint64(&self, _byte_offset: Option<u64>, _little_endian: Option<bool>) -> u64 {
64 0
65 }
66
67 fn uint64_be(&self, _byte_offset: Option<u64>) -> u64 {
68 0
69 }
70
71 fn uint64_le(&self, _byte_offset: Option<u64>) -> u64 {
72 0
73 }
74
75 fn int64(&self, _byte_offset: Option<u64>, _little_endian: Option<bool>) -> i64 {
76 0
77 }
78
79 fn int64_be(&self, _byte_offset: Option<u64>) -> i64 {
80 0
81 }
82
83 fn int64_le(&self, _byte_offset: Option<u64>) -> i64 {
84 0
85 }
86
87 fn f64(&self, _byte_offset: Option<u64>, _little_endian: Option<bool>) -> f64 {
88 0.
89 }
90
91 fn f64_be(&self, _byte_offset: Option<u64>) -> f64 {
92 0.
93 }
94
95 fn f64_le(&self, _byte_offset: Option<u64>) -> f64 {
96 0.
97 }
98
99 fn uint32(&self, _byte_offset: Option<u64>, _little_endian: Option<bool>) -> u32 {
100 0
101 }
102
103 fn uint32_be(&self, _byte_offset: Option<u64>) -> u32 {
104 0
105 }
106
107 fn uint32_le(&self, _byte_offset: Option<u64>) -> u32 {
108 0
109 }
110
111 fn int32(&self, _byte_offset: Option<u64>, _little_endian: Option<bool>) -> i32 {
112 0
113 }
114
115 fn int32_be(&self, _byte_offset: Option<u64>) -> i32 {
116 0
117 }
118
119 fn int32_le(&self, _byte_offset: Option<u64>) -> i32 {
120 0
121 }
122
123 fn f32(&self, _byte_offset: Option<u64>, _little_endian: Option<bool>) -> f32 {
124 0.
125 }
126
127 fn f32_be(&self, _byte_offset: Option<u64>) -> f32 {
128 0.
129 }
130
131 fn f32_le(&self, _byte_offset: Option<u64>) -> f32 {
132 0.
133 }
134
135 fn uint16(&self, _byte_offset: Option<u64>, _little_endian: Option<bool>) -> u16 {
136 0
137 }
138
139 fn uint16_be(&self, _byte_offset: Option<u64>) -> u16 {
140 0
141 }
142
143 fn uint16_le(&self, _byte_offset: Option<u64>) -> u16 {
144 0
145 }
146
147 fn int16(&self, _byte_offset: Option<u64>, _little_endian: Option<bool>) -> i16 {
148 0
149 }
150
151 fn int16_be(&self, _byte_offset: Option<u64>) -> i16 {
152 0
153 }
154
155 fn int16_le(&self, _byte_offset: Option<u64>) -> i16 {
156 0
157 }
158
159 fn f16(&self, _byte_offset: Option<u64>, _little_endian: Option<bool>) -> f32 {
160 0.
161 }
162
163 fn f16_be(&self, _byte_offset: Option<u64>) -> f32 {
164 0.
165 }
166
167 fn f16_le(&self, _byte_offset: Option<u64>) -> f32 {
168 0.
169 }
170
171 fn uint8(&self, _byte_offset: Option<u64>) -> u8 {
172 0
173 }
174
175 fn int8(&self, _byte_offset: Option<u64>) -> i8 {
176 0
177 }
178
179 fn tell(&self) -> u64 {
180 *self.cursor.borrow()
181 }
182
183 fn seek(&self, pos: u64) {
184 *self.cursor.borrow_mut() = pos;
185 }
186
187 fn slice(&self, _begin: Option<u64>, _end: Option<u64>) -> Vec<u8> {
188 vec![]
189 }
190
191 fn seek_slice(&self, _size: usize) -> Vec<u8> {
192 vec![]
193 }
194
195 fn parse_string(&self, _byte_offset: Option<u64>, _byte_length: Option<u64>) -> String {
196 "".into()
197 }
198
199 async fn get_slice(&self, byte_offset: u64, byte_length: Option<u64>) -> Vec<u8> {
200 if self.range_requests {
201 let bytes = format!(
202 "{}-{}",
203 byte_offset,
204 byte_length.map(|l| (l + byte_offset - 1).to_string()).unwrap_or("".to_string())
205 );
206 fetch_url::<()>(&self.path, &[("Range", &format!("bytes={}", bytes))], None, None)
207 .await
208 .unwrap()
209 } else {
210 let bytes = format!(
211 "{}-{}",
212 byte_offset,
213 byte_length.map(|l| (l + byte_offset).to_string()).unwrap_or("".to_string())
214 );
215 fetch_url::<()>(&format!("{}?bytes={}", self.path, bytes), &[], None, None)
216 .await
217 .unwrap()
218 }
219 }
220}