openstreetmap_api/
types.rs

1use serde::ser::Serialize;
2use std::collections::HashMap;
3use std::fmt;
4
5#[derive(Debug, Clone)]
6pub enum Credentials {
7    Basic(String, String), // Username, password
8    None,
9}
10
11pub enum RequestBody<S: Serialize> {
12    Xml(S),
13    Form(S),
14    RawForm(Vec<u8>),
15    None,
16}
17
18#[derive(Debug, PartialEq, Eq)]
19pub struct VersionRange {
20    pub minimum: String,
21    pub maximum: String,
22}
23
24#[derive(Debug, PartialEq, Eq, Deserialize)]
25pub struct Status {
26    pub database: String,
27    pub api: String,
28    pub gpx: String,
29}
30
31#[derive(Debug, PartialEq)]
32pub struct Capabilities {
33    pub versions: VersionRange,
34    pub maximum_area: f64,
35    pub maximum_note_area: f64,
36    pub tracepoints_per_page: u64,
37    pub maximum_waynodes: u64,
38    pub maximum_changeset_elements: u64,
39    pub timeout: u64,
40    pub status: Status,
41}
42
43#[derive(Debug, PartialEq, Eq, Deserialize)]
44pub struct Blacklist {
45    pub regex: String,
46}
47
48#[derive(Debug, PartialEq, Eq, Deserialize)]
49pub struct Imagery {
50    pub blacklist: Vec<Blacklist>,
51}
52
53#[derive(Debug, PartialEq, Eq, Deserialize)]
54pub struct Policy {
55    pub imagery: Imagery,
56}
57
58#[derive(Debug, PartialEq)]
59pub struct CapabilitiesAndPolicy {
60    pub capabilities: Capabilities,
61    pub policy: Policy,
62}
63
64#[derive(Debug, PartialEq, Clone, Copy)]
65pub struct BoundingBox {
66    pub left: f64,
67    pub bottom: f64,
68    pub right: f64,
69    pub top: f64,
70}
71
72#[derive(Debug, PartialEq, Eq, Deserialize, Serialize, Clone)]
73pub struct Tag {
74    pub k: String,
75    pub v: String,
76}
77
78impl Tag {
79    pub fn new(k: &str, v: &str) -> Self {
80        Tag {
81            k: k.into(),
82            v: v.into(),
83        }
84    }
85}
86
87#[derive(Debug, PartialEq, Deserialize, Serialize)]
88#[serde(rename = "node")]
89pub struct Node {
90    pub id: u64,
91    pub visible: bool,
92    pub version: u64,
93    pub changeset: u64,
94    pub timestamp: String,
95    pub user: Option<String>,
96    pub uid: Option<u64>,
97    pub lat: Option<f64>,
98    pub lon: Option<f64>,
99    #[serde(rename = "tag", default)]
100    pub tags: Vec<Tag>,
101}
102
103#[derive(Debug, PartialEq, Eq, Deserialize, Serialize)]
104pub struct NodeRef {
105    #[serde(rename = "ref")]
106    pub node_id: u64,
107}
108
109#[derive(Debug, PartialEq, Eq, Deserialize, Serialize)]
110pub struct Member {
111    #[serde(rename = "type")]
112    pub member_type: String,
113    #[serde(rename = "ref")]
114    pub node_id: u64,
115    pub role: String,
116}
117
118#[derive(Debug, PartialEq, Eq, Deserialize, Serialize)]
119#[serde(rename = "way")]
120pub struct Way {
121    pub id: u64,
122    pub visible: bool,
123    pub version: u64,
124    pub changeset: u64,
125    pub timestamp: String,
126    pub user: String,
127    pub uid: u64,
128    #[serde(rename = "nd", default)]
129    pub node_refs: Vec<NodeRef>,
130    #[serde(rename = "tag", default)]
131    pub tags: Vec<Tag>,
132}
133
134#[derive(Debug, PartialEq, Eq, Deserialize, Serialize)]
135#[serde(rename = "relation")]
136pub struct Relation {
137    pub id: u64,
138    pub visible: bool,
139    pub version: u64,
140    pub changeset: u64,
141    pub timestamp: String,
142    pub user: String,
143    pub uid: u64,
144    #[serde(rename = "tag", default)]
145    pub tags: Vec<Tag>,
146    #[serde(rename = "member", default)]
147    pub members: Vec<Member>,
148}
149
150#[derive(Debug, PartialEq)]
151pub struct Map {
152    pub bounds: BoundingBox,
153    pub nodes: Vec<Node>,
154    pub ways: Vec<Way>,
155    pub relations: Vec<Relation>,
156}
157
158#[derive(Debug, PartialEq, Eq, Deserialize)]
159pub struct Permission {
160    pub name: String,
161}
162
163#[derive(Debug, PartialEq, Eq, Deserialize, Serialize, Clone)]
164#[serde(rename = "changeset")]
165pub struct ChangesetCreate {
166    version: String,
167    generator: String,
168    #[serde(rename = "tag", default)]
169    tags: Vec<Tag>,
170}
171
172impl ChangesetCreate {
173    pub fn new(version: &str, generator: &str, tags: Vec<Tag>) -> Self {
174        ChangesetCreate {
175            version: version.into(),
176            generator: generator.into(),
177            tags,
178        }
179    }
180}
181
182#[derive(Debug, PartialEq, Eq, Deserialize)]
183pub struct DiscussionComment {
184    pub date: String,
185    pub uid: u64,
186    pub user: String,
187    pub text: String,
188}
189
190#[derive(Debug, PartialEq, Eq, Deserialize)]
191pub struct Discussion {
192    #[serde(rename = "comment", default)]
193    pub comments: Vec<DiscussionComment>,
194}
195
196#[derive(Debug, PartialEq, Deserialize)]
197pub struct Changeset {
198    pub id: u64,
199    pub user: String,
200    pub uid: u64,
201    pub created_at: String,
202    pub closed_at: Option<String>,
203    pub open: bool,
204    pub discussion: Option<Discussion>,
205    #[serde(rename = "tag", default)]
206    pub tags: Vec<Tag>,
207
208    // The bounding box attributes will be missing for an empty changeset
209    pub min_lon: Option<f64>,
210    pub min_lat: Option<f64>,
211    pub max_lon: Option<f64>,
212    pub max_lat: Option<f64>,
213}
214
215#[derive(Debug, PartialEq, Deserialize, Serialize)]
216pub struct Modification {
217    #[serde(rename = "node", default)]
218    pub nodes: Vec<Node>,
219    #[serde(rename = "way", default)]
220    pub ways: Vec<Way>,
221    #[serde(rename = "relation", default)]
222    pub relations: Vec<Relation>,
223}
224
225#[derive(Debug, PartialEq, Deserialize, Serialize)]
226pub struct Creation {
227    #[serde(rename = "node", default)]
228    pub nodes: Vec<Node>,
229    #[serde(rename = "way", default)]
230    pub ways: Vec<Way>,
231    #[serde(rename = "relation", default)]
232    pub relations: Vec<Relation>,
233}
234
235#[derive(Debug, PartialEq, Deserialize, Serialize)]
236pub struct Deletion {
237    #[serde(rename = "node", default)]
238    pub nodes: Vec<Node>,
239    #[serde(rename = "way", default)]
240    pub ways: Vec<Way>,
241    #[serde(rename = "relation", default)]
242    pub relations: Vec<Relation>,
243}
244
245#[derive(Debug, PartialEq, Deserialize, Serialize)]
246#[serde(rename = "osmChange")]
247pub struct ChangesetChanges {
248    #[serde(rename = "modify", default)]
249    pub modifications: Vec<Modification>,
250    #[serde(rename = "create", default)]
251    pub creations: Vec<Creation>,
252    #[serde(rename = "delete", default)]
253    pub deletions: Vec<Deletion>,
254}
255
256#[derive(Debug, PartialEq, Eq, Deserialize)]
257#[serde(rename = "node")]
258pub struct DiffNode {
259    pub old_id: u64,
260    pub new_id: u64,
261    pub new_version: u64,
262}
263
264#[derive(Debug, PartialEq, Eq, Deserialize)]
265#[serde(rename = "node")]
266pub struct DiffWay {
267    pub old_id: u64,
268    pub new_id: u64,
269    pub new_version: u64,
270}
271
272#[derive(Debug, PartialEq, Eq, Deserialize)]
273#[serde(rename = "node")]
274pub struct DiffRelation {
275    pub old_id: u64,
276    pub new_id: u64,
277    pub new_version: u64,
278}
279
280#[derive(Debug, PartialEq, Eq, Deserialize)]
281#[serde(rename = "diffResult")]
282pub struct DiffResult {
283    #[serde(rename = "node", default)]
284    pub nodes: Vec<DiffNode>,
285    #[serde(rename = "way", default)]
286    pub ways: Vec<DiffWay>,
287    #[serde(rename = "relation", default)]
288    pub relations: Vec<DiffRelation>,
289}
290
291#[derive(Debug, Default, PartialEq)]
292pub struct ChangesetQueryParams {
293    pub bbox: Option<BoundingBox>,
294    pub user_id: Option<u64>,
295    pub display_name: Option<String>,
296    pub closed_after: Option<String>,
297    pub created_before: Option<String>,
298    pub open: Option<bool>,
299    pub closed: Option<bool>,
300    pub changeset_ids: Option<Vec<u64>>,
301}
302
303#[derive(Debug, Default, PartialEq, Eq)]
304pub struct ElementIdParam {
305    pub id: u64,
306    pub version: Option<u64>,
307}
308
309impl ElementIdParam {
310    pub fn new(id: u64, version: Option<u64>) -> Self {
311        Self { id, version }
312    }
313}
314
315impl fmt::Display for ElementIdParam {
316    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
317        write!(
318            f,
319            "{}{}",
320            self.id,
321            self.version.map_or("".to_string(), |v| format!("v{}", v))
322        )
323    }
324}
325
326#[derive(Debug, PartialEq, Deserialize)]
327pub struct WayFull {
328    pub way: Way,
329    #[serde(rename = "node", default)]
330    pub nodes: Vec<Node>,
331}
332
333#[derive(Debug, PartialEq, Deserialize)]
334pub struct RelationFull {
335    pub relation: Relation,
336    #[serde(rename = "way", default)]
337    pub ways: Vec<Way>,
338    #[serde(rename = "node", default)]
339    pub nodes: Vec<Node>,
340}
341
342#[derive(Debug, Default, PartialEq, Eq, Deserialize)]
343pub struct ContributorTerms {
344    pub agreed: bool,
345    #[serde(rename = "pd", default)]
346    pub public_domain: bool,
347}
348
349#[derive(Debug, PartialEq, Eq, Deserialize)]
350pub struct Image {
351    #[serde(rename = "href")]
352    pub url: String,
353}
354
355#[derive(Debug, Default, PartialEq, Eq, Deserialize)]
356pub struct UserChangesets {
357    pub count: u64,
358}
359
360#[derive(Debug, Default, PartialEq, Eq, Deserialize)]
361pub struct Traces {
362    pub count: u64,
363}
364
365#[derive(Debug, Default, PartialEq, Eq, Deserialize)]
366pub struct Block {
367    pub count: u64,
368    pub active: u64,
369}
370
371#[derive(Debug, PartialEq, Deserialize)]
372pub struct CoordsView {
373    pub lat: f64,
374    pub lon: f64,
375    pub zoom: u8,
376}
377
378#[derive(Debug, Default, PartialEq, Eq)]
379pub struct Messages {
380    pub received: u64,
381    pub unread: u64,
382    pub sent: u64,
383}
384
385#[derive(Debug, Default, PartialEq)]
386pub struct User {
387    pub id: u64,
388    pub display_name: String,
389    pub account_created: String,
390    pub description: Option<String>,
391    pub contributor_terms: ContributorTerms,
392    pub image: Option<Image>,
393    pub changesets: UserChangesets,
394    pub traces: Traces,
395    pub blocks: Vec<Block>,
396    pub home: Option<CoordsView>,
397    pub languages: Vec<String>,
398    pub messages: Messages,
399}
400
401pub type UserPreferences = HashMap<String, String>;
402
403#[derive(Debug, Default, PartialEq, Eq, Deserialize)]
404pub struct Comment {
405    #[serde(rename = "uid")]
406    pub id: u64,
407    pub date: String,
408    pub user: String,
409    pub user_url: String,
410    pub action: String,
411    pub text: String,
412    pub html: String,
413}
414
415#[derive(Debug, Default, PartialEq)]
416pub struct Note {
417    pub id: u64,
418    pub lon: f64,
419    pub lat: f64,
420    pub url: String,
421    pub comment_url: String,
422    pub close_url: String,
423    pub created_at: String,
424    pub status: String,
425    pub comments: Vec<Comment>,
426}
427
428#[derive(Debug, Default, PartialEq, Serialize)]
429pub struct NoteContent {
430    pub lat: f64,
431    pub lon: f64,
432    pub text: String,
433}
434
435#[derive(Debug, Serialize)]
436#[serde(rename_all = "snake_case")]
437pub enum NoteSearchSortOption {
438    CreatedAt,
439    UpdatedAt,
440}
441
442#[derive(Debug, Serialize)]
443#[serde(rename_all = "lowercase")]
444pub enum NoteSearchOrderOption {
445    Oldest,
446    Newest,
447}
448
449#[derive(Debug, Default, Serialize)]
450pub struct NoteSearchOptions {
451    pub q: String,
452    pub limit: Option<u16>,
453    pub closed: Option<i64>,
454    pub display_name: Option<String>,
455    pub user: Option<u64>,
456    pub from: Option<String>,
457    pub to: Option<String>,
458    pub sort: Option<NoteSearchSortOption>,
459    pub order: Option<NoteSearchOrderOption>,
460}