maplibre/raster/
transferables.rs

1use std::fmt::{Debug, Formatter};
2
3use image::RgbaImage;
4
5use crate::{
6    coords::WorldTileCoords,
7    io::apc::{IntoMessage, Message, MessageTag},
8    raster::{AvailableRasterLayerData, MissingRasterLayerData},
9};
10
11#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
12pub enum RasterMessageTag {
13    LayerRaster,
14    LayerRasterMissing,
15}
16
17impl MessageTag for RasterMessageTag {
18    fn dyn_clone(&self) -> Box<dyn MessageTag> {
19        Box::new(*self)
20    }
21}
22
23pub trait LayerRaster: IntoMessage + Debug + Send {
24    fn message_tag() -> &'static dyn MessageTag;
25
26    fn build_from(coords: WorldTileCoords, layer_name: String, image: RgbaImage) -> Self;
27
28    fn coords(&self) -> WorldTileCoords;
29
30    fn to_layer(self) -> AvailableRasterLayerData;
31}
32
33pub trait LayerRasterMissing: IntoMessage + Debug + Send {
34    fn message_tag() -> &'static dyn MessageTag;
35
36    fn build_from(coords: WorldTileCoords) -> Self;
37
38    fn coords(&self) -> WorldTileCoords;
39
40    fn to_layer(self) -> MissingRasterLayerData;
41}
42
43pub struct DefaultLayerRaster {
44    pub coords: WorldTileCoords,
45    pub layer_name: String,
46    pub image: RgbaImage,
47}
48
49impl Debug for DefaultLayerRaster {
50    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
51        write!(f, "DefaultRasterLayer({})", self.coords)
52    }
53}
54
55impl IntoMessage for DefaultLayerRaster {
56    fn into(self) -> Message {
57        Message::new(Self::message_tag(), Box::new(self))
58    }
59}
60
61impl LayerRaster for DefaultLayerRaster {
62    fn message_tag() -> &'static dyn MessageTag {
63        &RasterMessageTag::LayerRaster
64    }
65
66    fn build_from(coords: WorldTileCoords, layer_name: String, image: RgbaImage) -> Self {
67        Self {
68            coords,
69            layer_name,
70            image,
71        }
72    }
73
74    fn coords(&self) -> WorldTileCoords {
75        self.coords
76    }
77
78    fn to_layer(self) -> AvailableRasterLayerData {
79        AvailableRasterLayerData {
80            coords: self.coords,
81            source_layer: "raster".to_string(),
82            image: self.image,
83        }
84    }
85}
86
87pub struct DefaultLayerRasterMissing {
88    pub coords: WorldTileCoords,
89}
90
91impl Debug for DefaultLayerRasterMissing {
92    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
93        write!(f, "DefaultRasterLayerMissing({})", self.coords)
94    }
95}
96
97impl IntoMessage for DefaultLayerRasterMissing {
98    fn into(self) -> Message {
99        Message::new(Self::message_tag(), Box::new(self))
100    }
101}
102
103impl LayerRasterMissing for DefaultLayerRasterMissing {
104    fn message_tag() -> &'static dyn MessageTag {
105        &RasterMessageTag::LayerRasterMissing
106    }
107
108    fn build_from(coords: WorldTileCoords) -> Self {
109        Self { coords }
110    }
111
112    fn coords(&self) -> WorldTileCoords {
113        self.coords
114    }
115
116    fn to_layer(self) -> MissingRasterLayerData {
117        MissingRasterLayerData {
118            coords: self.coords,
119            source_layer: "raster".to_string(),
120        }
121    }
122}
123
124pub trait RasterTransferables: Copy + Clone + 'static {
125    type LayerRaster: LayerRaster;
126    type LayerRasterMissing: LayerRasterMissing;
127}
128
129#[derive(Copy, Clone)]
130pub struct DefaultRasterTransferables;
131
132impl RasterTransferables for DefaultRasterTransferables {
133    type LayerRaster = DefaultLayerRaster;
134    type LayerRasterMissing = DefaultLayerRasterMissing;
135}