# source_type.rs - source
Source of the Rust file `maplibre/src/io/source_type.rs`.

    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

    use crate::{coords::WorldTileCoords, style::source::TileAddressingScheme};

    /// Represents a source from which the vector tile are fetched.
    #[derive(Clone)]
    pub struct TessellateSource {
        pub url: String,
        pub filetype: String,
    }

    impl TessellateSource {
        pub fn new(url: &str, filetype: &str) -> Self {
            Self {
                url: url.to_string(),
                filetype: filetype.to_string(),
            }
        }

        pub fn format(&self, coords: &WorldTileCoords) -> String {
            let tile_coords = coords.into_tile(TileAddressingScheme::XYZ).unwrap();
            format!(
                "{url}/{z}/{x}/{y}.{filetype}",
                url = self.url,
                z = tile_coords.z,
                x = tile_coords.x,
                y = tile_coords.y,
                filetype = self.filetype,
            )
        }
    }

    impl Default for TessellateSource {
        fn default() -> Self {
            Self::new("https://maps.tuerantuer.org/europe_germany", "pbf")
        }
    }

    /// Represents a source from which the raster tile are fetched.
    #[derive(Clone)]
    pub struct RasterSource {
        pub url: String,
        pub filetype: String,
        pub key: String,
    }

    impl RasterSource {
        pub fn new(url: &str, filetype: &str, key: &str) -> Self {
            Self {
                url: url.to_string(),
                filetype: filetype.to_string(),
                key: key.to_string(),
            }
        }

        pub fn format(&self, coords: &WorldTileCoords) -> String {
            let tile_coords = coords.into_tile(TileAddressingScheme::XYZ).unwrap();
            format!(
                "{url}/{z}/{x}/{y}.{filetype}?key={key}",
                url = self.url,
                z = tile_coords.z,
                x = tile_coords.x,
                y = tile_coords.y,
                filetype = self.filetype,
                key = self.key,
            )
        }
    }

    impl Default for RasterSource {
        fn default() -> Self {
            Self::new(
                "https://api.maptiler.com/tiles/satellite-v2",
                "jpg",
                "qnePkfbGpMsLCi3KFBs3",
            )
        }
    }

    /// Represents the tiles' different types of source.
    #[derive(Clone)]
    pub enum SourceType {
        Raster(RasterSource),
        Tessellate(TessellateSource),
    }

    impl SourceType {
        pub fn format(&self, coords: &WorldTileCoords) -> String {
            match self {
                SourceType::Raster(raster_source) => raster_source.format(coords),
                SourceType::Tessellate(tessellate_source) => tessellate_source.format(coords),
            }
        }
    }