avenger 0.0.3

A visualization engine and renderer
Documentation
use crate::marks::value::{ColorOrGradient, EncodingValue, Gradient, StrokeCap};
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct RuleMark {
    pub name: String,
    pub clip: bool,
    pub len: u32,
    pub gradients: Vec<Gradient>,
    pub stroke_dash: Option<EncodingValue<Vec<f32>>>,
    pub x0: EncodingValue<f32>,
    pub y0: EncodingValue<f32>,
    pub x1: EncodingValue<f32>,
    pub y1: EncodingValue<f32>,
    pub stroke: EncodingValue<ColorOrGradient>,
    pub stroke_width: EncodingValue<f32>,
    pub stroke_cap: EncodingValue<StrokeCap>,
    pub indices: Option<Vec<usize>>,
    pub zindex: Option<i32>,
}

impl RuleMark {
    pub fn x0_iter(&self) -> Box<dyn Iterator<Item = &f32> + '_> {
        self.x0.as_iter(self.len as usize, self.indices.as_ref())
    }
    pub fn y0_iter(&self) -> Box<dyn Iterator<Item = &f32> + '_> {
        self.y0.as_iter(self.len as usize, self.indices.as_ref())
    }
    pub fn x1_iter(&self) -> Box<dyn Iterator<Item = &f32> + '_> {
        self.x1.as_iter(self.len as usize, self.indices.as_ref())
    }
    pub fn y1_iter(&self) -> Box<dyn Iterator<Item = &f32> + '_> {
        self.y1.as_iter(self.len as usize, self.indices.as_ref())
    }
    pub fn stroke_iter(&self) -> Box<dyn Iterator<Item = &ColorOrGradient> + '_> {
        self.stroke
            .as_iter(self.len as usize, self.indices.as_ref())
    }
    pub fn stroke_width_iter(&self) -> Box<dyn Iterator<Item = &f32> + '_> {
        self.stroke_width
            .as_iter(self.len as usize, self.indices.as_ref())
    }
    pub fn stroke_cap_iter(&self) -> Box<dyn Iterator<Item = &StrokeCap> + '_> {
        self.stroke_cap
            .as_iter(self.len as usize, self.indices.as_ref())
    }
    pub fn stroke_dash_iter(&self) -> Option<Box<dyn Iterator<Item = &Vec<f32>> + '_>> {
        if let Some(stroke_dash) = &self.stroke_dash {
            Some(stroke_dash.as_iter(self.len as usize, self.indices.as_ref()))
        } else {
            None
        }
    }
}

impl Default for RuleMark {
    fn default() -> Self {
        Self {
            name: "rule_mark".to_string(),
            clip: true,
            len: 1,
            gradients: vec![],
            stroke_dash: None,
            x0: EncodingValue::Scalar { value: 0.0 },
            y0: EncodingValue::Scalar { value: 0.0 },
            x1: EncodingValue::Scalar { value: 0.0 },
            y1: EncodingValue::Scalar { value: 0.0 },
            stroke: EncodingValue::Scalar {
                value: ColorOrGradient::Color([0.0, 0.0, 0.0, 1.0]),
            },
            stroke_width: EncodingValue::Scalar { value: 1.0 },
            stroke_cap: EncodingValue::Scalar {
                value: StrokeCap::Butt,
            },
            indices: None,
            zindex: None,
        }
    }
}