openstreetmap_api/api/
capabilities.rs

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