maplibre/raster/
transferables.rs1use 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}