gistools/parsers/read/
fetch.rs

1use crate::{parsers::Reader, util::fetch_url};
2use core::cell::RefCell;
3
4/// # Fetch Reader
5///
6/// ## Description
7/// The browser reader that fetches data from a URL.
8///
9/// Implements the [`Reader`] trait.
10///
11/// Useful for [`crate::readers::PMTilesReader`] and [`crate::readers::S2TilesReader`]
12///
13/// ## Usage
14/// ```rust,no_run
15/// use gistools::{
16///     parsers::FetchReader,
17///     readers::PMTilesReader,
18/// };
19/// use s2_tilejson::{Encoding, Metadata, Scheme, SourceType};
20///
21/// let url = "...".into();
22/// let mut reader = PMTilesReader::new(FetchReader::new(url, true), None);
23///
24/// let metadata = reader.get_metadata();
25/// assert_eq!(
26///     *metadata,
27///     Metadata {
28///         s2tilejson: "1.0.0".into(),
29///         version: "1.0.0".into(),
30///         name: "default".into(),
31///         scheme: Scheme::Fzxy,
32///         description: "Built with s2maps-cli".into(),
33///         r#type: SourceType::Vector,
34///         extension: "pbf".into(),
35///         encoding: Encoding::None,
36///         minzoom: 0,
37///         maxzoom: 27,
38///         ..Default::default()
39///     }
40/// );
41/// ```
42#[derive(Debug, Clone)]
43pub struct FetchReader {
44    path: String,
45    range_requests: bool,
46    cursor: RefCell<u64>,
47}
48impl FetchReader {
49    /// Create a new FetchReader
50    ///
51    /// ## Parameters
52    /// - `path`: the location of the PMTiles data
53    /// - `range_requests`: FetchReader specific; enable range requests or use urlParam "bytes"
54    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}