1use serde::{Deserialize, Serialize};
4
5pub type TileUrl = String;
7
8pub type TileJSONUrl = String;
10
11#[derive(Serialize, Deserialize, Debug, Clone)]
13pub enum TileAddressingScheme {
14 #[serde(rename = "xyz")]
15 XYZ,
16 #[serde(rename = "tms")]
17 TMS,
18}
19
20impl Default for TileAddressingScheme {
21 fn default() -> Self {
22 TileAddressingScheme::XYZ
23 }
24}
25
26#[derive(Serialize, Deserialize, Debug, Clone)]
28#[serde(untagged)]
29pub enum GeoJsonData {
30 Url(String),
31 Inline(serde_json::Value),
32}
33
34#[derive(Serialize, Deserialize, Debug, Clone)]
36pub struct GeoJsonSource {
37 pub data: GeoJsonData,
38 #[serde(skip_serializing_if = "Option::is_none")]
39 pub maxzoom: Option<u8>,
40 #[serde(skip_serializing_if = "Option::is_none")]
41 pub minzoom: Option<u8>,
42}
43
44#[derive(Serialize, Deserialize, Debug, Clone)]
46pub struct VectorSource {
47 #[serde(skip_serializing_if = "Option::is_none")]
49 pub attribution: Option<String>,
50 #[serde(skip_serializing_if = "Option::is_none")]
52 pub bounds: Option<(f64, f64, f64, f64)>,
53 #[serde(skip_serializing_if = "Option::is_none")]
55 pub maxzoom: Option<u8>,
56 #[serde(skip_serializing_if = "Option::is_none")]
58 pub minzoom: Option<u8>,
59 #[serde(default)]
61 #[serde(skip_serializing_if = "Option::is_none")]
62 pub scheme: Option<TileAddressingScheme>,
63 #[serde(skip_serializing_if = "Option::is_none")]
65 pub tiles: Option<Vec<TileUrl>>,
66 }
69
70#[derive(Serialize, Deserialize, Debug, Clone)]
71#[serde(tag = "type")]
72pub enum Source {
73 #[serde(rename = "vector")]
74 Vector(VectorSource),
75 #[serde(rename = "raster")]
76 Raster(VectorSource), #[serde(rename = "geojson")]
78 GeoJson(GeoJsonSource),
79}