1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
use crate::types;
use crate::Openstreetmap;
use crate::OpenstreetmapError;
use crate::RequestOptions;
#[derive(Debug, Deserialize)]
struct Osm {
pub api: Api,
pub policy: types::Policy,
}
impl From<Osm> for types::CapabilitiesAndPolicy {
fn from(value: Osm) -> types::CapabilitiesAndPolicy {
types::CapabilitiesAndPolicy {
capabilities: types::Capabilities {
versions: types::VersionRange {
minimum: value.api.version.minimum,
maximum: value.api.version.maximum,
},
maximum_area: value.api.area.maximum,
maximum_note_area: value.api.note_area.maximum,
tracepoints_per_page: value.api.tracepoints.per_page,
maximum_waynodes: value.api.waynodes.maximum,
maximum_changeset_elements: value.api.changesets.maximum_elements,
timeout: value.api.timeout.seconds,
status: types::Status {
database: value.api.status.database,
api: value.api.status.api,
gpx: value.api.status.gpx,
},
},
policy: value.policy,
}
}
}
#[derive(Debug, Deserialize)]
struct Api {
pub version: Version,
pub area: Area,
pub note_area: NoteArea,
pub tracepoints: Tracepoints,
pub waynodes: Waynodes,
pub changesets: Changesets,
pub timeout: Timeout,
pub status: types::Status,
}
#[derive(Debug, Deserialize)]
struct Version {
pub minimum: String,
pub maximum: String,
}
#[derive(Debug, Deserialize)]
struct Area {
pub maximum: f64,
}
#[derive(Debug, Deserialize)]
struct NoteArea {
pub maximum: f64,
}
#[derive(Debug, Deserialize)]
struct Tracepoints {
pub per_page: u64,
}
#[derive(Debug, Deserialize)]
struct Waynodes {
pub maximum: u64,
}
#[derive(Debug, Deserialize)]
struct Changesets {
pub maximum_elements: u64,
}
#[derive(Debug, Deserialize)]
struct Timeout {
pub seconds: u64,
}
pub struct Capabilities {
client: Openstreetmap,
}
impl Capabilities {
pub fn new(client: &Openstreetmap) -> Self {
Capabilities {
client: client.clone(),
}
}
pub async fn get(&self) -> Result<types::CapabilitiesAndPolicy, OpenstreetmapError> {
let capabilities_and_policies: types::CapabilitiesAndPolicy = self
.client
.request::<(), Osm>(
reqwest::Method::GET,
"capabilities",
types::RequestBody::None,
RequestOptions::new(),
)
.await?
.into();
Ok(capabilities_and_policies)
}
}