use std::any::Any;
use std::sync::Arc;
use maybe_sync::{MaybeSend, MaybeSync};
use parking_lot::RwLock;
use crate::layer::attribution::Attribution;
use crate::messenger::Messenger;
use crate::render::Canvas;
use crate::view::MapView;
use crate::TileSchema;
pub mod attribution;
pub mod data_provider;
pub mod feature_layer;
pub mod raster_tile_layer;
pub(crate) mod tiles;
pub mod vector_tile_layer;
pub use feature_layer::{FeatureId, FeatureLayer};
pub use raster_tile_layer::RasterTileLayer;
pub use vector_tile_layer::VectorTileLayer;
pub trait Layer: MaybeSend + MaybeSync {
fn render(&self, view: &MapView, canvas: &mut dyn Canvas);
fn prepare(&self, view: &MapView);
fn set_messenger(&mut self, messenger: Box<dyn Messenger>);
fn as_any(&self) -> &dyn Any;
fn as_any_mut(&mut self) -> &mut dyn Any;
fn tile_schema(&self) -> Option<TileSchema> {
None
}
fn attribution(&self) -> Option<Attribution>;
}
impl<T: Layer + 'static> Layer for Arc<RwLock<T>> {
fn render(&self, position: &MapView, canvas: &mut dyn Canvas) {
self.read().render(position, canvas)
}
fn prepare(&self, view: &MapView) {
self.read().prepare(view)
}
fn set_messenger(&mut self, messenger: Box<dyn Messenger>) {
self.write().set_messenger(messenger)
}
fn as_any(&self) -> &dyn Any {
self
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
fn tile_schema(&self) -> Option<TileSchema> {
self.read().tile_schema()
}
fn attribution(&self) -> Option<Attribution> {
self.read().attribution()
}
}
#[cfg(feature = "_tests")]
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct TestLayer(pub &'static str);
#[cfg(feature = "_tests")]
impl Layer for TestLayer {
fn render(&self, _view: &MapView, _canvas: &mut dyn Canvas) {
unimplemented!()
}
fn prepare(&self, _view: &MapView) {
unimplemented!()
}
fn set_messenger(&mut self, _messenger: Box<dyn Messenger>) {
unimplemented!()
}
fn as_any(&self) -> &dyn Any {
self
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
fn attribution(&self) -> Option<Attribution> {
None
}
}