use crate::drawable::Dimensions;
pub mod circle;
pub mod line;
pub mod rect;
pub mod triangle;
pub trait Primitive: Dimensions {}
pub use self::circle::Circle;
pub use self::line::Line;
pub use self::rect::Rect;
pub use self::triangle::Triangle;
#[macro_export]
macro_rules! circle {
(($cx:expr, $cy:expr), $r:expr $(, $style_key:ident = $style_value:expr )* $(,)?) => {{
#[allow(unused_imports)]
use $crate::style::WithStyle;
$crate::primitives::Circle::new($crate::coord::Coord::new($cx, $cy), $r)
$( .$style_key($style_value) )*
}};
}
#[macro_export]
macro_rules! line {
(($x1:expr, $y1:expr), ($x2:expr, $y2:expr) $(, $style_key:ident = $style_value:expr )* $(,)?) => {{
#[allow(unused_imports)]
use $crate::style::WithStyle;
$crate::primitives::Line::new($crate::coord::Coord::new($x1, $y1), $crate::coord::Coord::new($x2, $y2))
$( .$style_key($style_value) )*
}};
}
#[macro_export]
macro_rules! rect {
(($x1:expr, $y1:expr), ($x2:expr, $y2:expr) $(, $style_key:ident = $style_value:expr )* $(,)?) => {{
#[allow(unused_imports)]
use $crate::style::WithStyle;
$crate::primitives::Rect::new($crate::coord::Coord::new($x1, $y1), $crate::coord::Coord::new($x2, $y2))
$( .$style_key($style_value) )*
}};
}
#[macro_export]
macro_rules! triangle {
(($x1:expr, $y1:expr), ($x2:expr, $y2:expr), ($x3:expr, $y3:expr) $(, $style_key:ident = $style_value:expr )* $(,)?) => {{
#[allow(unused_imports)]
use $crate::style::WithStyle;
$crate::primitives::Triangle::new($crate::coord::Coord::new($x1, $y1), $crate::coord::Coord::new($x2, $y2), $crate::coord::Coord::new($x3, $y3))
$( .$style_key($style_value) )*
}};
}
#[cfg(test)]
mod tests {
use super::*;
use crate::style::Style;
#[test]
fn circle() {
let _c: Circle<u8> = circle!((10, 20), 30);
let _c: Circle<u8> = circle!((10, 20), 30, stroke = Some(1u8), fill = Some(10u8));
let _c: Circle<u8> = circle!((10, 20), 30, style = Style::default());
}
#[test]
fn line() {
let _l: Line<u8> = line!((10, 20), (30, 40));
let _l: Line<u8> = line!((10, 20), (30, 40), stroke = Some(1u8), fill = Some(10u8));
let _l: Line<u8> = line!((10, 20), (30, 40), style = Style::default());
}
#[test]
fn rect() {
let _r: Rect<u8> = rect!((10, 20), (30, 40));
let _r: Rect<u8> = rect!((10, 20), (30, 40), stroke = Some(1u8), fill = Some(10u8));
let _r: Rect<u8> = rect!((10, 20), (30, 40), style = Style::default());
}
#[test]
fn triangle() {
let _t: Triangle<u8> = triangle!((10, 20), (30, 40), (50, 60));
let _t: Triangle<u8> = triangle!(
(10, 20),
(30, 40),
(50, 60),
stroke = Some(1u8),
fill = Some(10u8)
);
let _t: Triangle<u8> = triangle!((10, 20), (30, 40), (50, 60), style = Style::default());
}
}