1use serde::ser::Serialize;
2use std::collections::HashMap;
3use std::fmt;
4
5#[derive(Debug, Clone)]
6pub enum Credentials {
7 Basic(String, String), 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 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}