geello 0.2.0

A tool to render geo data
Documentation
use std::collections::HashMap;

use geo::Point;
use vello::{
    kurbo::{Affine, Circle},
    peniko::{Brush, color::palette},
};

use crate::{MagicConverter, MagicFetcher, MagicValue, PropValue};

#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct PointRenderer {
    #[serde(default)]
    pub radius: MagicValue<PropValue>,
    #[serde(default)]
    pub brush: MagicValue<Brush>,
    #[serde(default)]
    pub must_show: MagicValue<PropValue>,
}

impl std::default::Default for PointRenderer {
    fn default() -> Self {
        PointRenderer {
            radius: MagicValue::wrap(0.1f64),
            brush: Brush::Solid(palette::css::LIGHT_YELLOW).into(),
            must_show: MagicValue::wrap(false),
        }
    }
}

impl MagicFetcher for PointRenderer {
    fn fetch(&mut self) -> Result<(), String> {
        self.radius.fetch()?;
        self.brush.fetch()?;
        Ok(())
    }
}

impl MagicConverter for PointRenderer {
    fn convert(&mut self, props: &HashMap<String, PropValue>) -> Result<(), String> {
        self.brush.convert(props)?;
        self.radius.convert(props)?;
        Ok(())
    }
}

impl PointRenderer {
    pub fn draw(
        &self,
        scene: &mut vello::Scene,
        transform: Affine,
        point: &Point,
    ) -> Result<(), String> {
        let brush = self.brush.as_ref();
        let radius = self.radius.inner_try_into()?;
        scene.fill(
            vello::peniko::Fill::NonZero,
            transform,
            brush,
            None,
            &Circle::new((point.x(), point.y()), radius),
        );
        Ok(())
    }
}