From: Ian Jackson Date: Sat, 14 May 2022 21:59:00 +0000 (+0100) Subject: Macro-ise spec::outline X-Git-Tag: otter-1.1.0~161 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=24948ee488767cca2f048f0704df3a3b47719f2a;p=otter.git Macro-ise spec::outline We're going to do more here... Signed-off-by: Ian Jackson --- diff --git a/src/spec.rs b/src/spec.rs index b0a57a68..a41ff8f7 100644 --- a/src/spec.rs +++ b/src/spec.rs @@ -257,16 +257,24 @@ pub struct ItemSpec { } mod outline { - use super::*; use crate::prelude::*; - use crate::shapelib::{CircleOutline, RectOutline}; - #[dyn_upcast(OutlineTrait)] - #[enum_dispatch(OutlineTrait)] - #[derive(Clone,Debug,Serialize,Deserialize)] - #[serde(tag="type")] - pub enum Outline { - #[serde(rename="Circle")] CircleOutline, - #[serde(rename="Rect")] RectOutline, + + macro_rules! shape_defns { { + $( $Shape:ident $serde:literal ;)* + } => { paste!{ + $( use crate::shapelib::[< $Shape Outline >]; )* + #[dyn_upcast(OutlineTrait)] + #[enum_dispatch(OutlineTrait)] + #[derive(Clone,Debug,Serialize,Deserialize)] + #[serde(tag="type")] + pub enum Outline { $( + #[serde(rename=$serde)] [< $Shape Outline >], + )* } + } } } + + shape_defns! { + Circle "Circle"; + Rect "Rect" ; } } pub use outline::*;