From 263e9131c0c30073fe03a95829436b9a8ddfd92f Mon Sep 17 00:00:00 2001 From: Bauke Date: Tue, 23 Jan 2024 18:06:24 +0100 Subject: [PATCH] Add the gegl_enum macro to generate enums with Display implemented. --- gegl/source/operations/generator.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/gegl/source/operations/generator.rs b/gegl/source/operations/generator.rs index 0e49766..80b65a3 100644 --- a/gegl/source/operations/generator.rs +++ b/gegl/source/operations/generator.rs @@ -43,3 +43,31 @@ macro_rules! gegl_operation { } }; } + +/// A macro to generate an enum that implements [`std::fmt::Display`]. +#[macro_export] +macro_rules! gegl_enum { + ( + $enum_name:ident, + $($key:ident: $value:expr),*, + ) => { + #[doc = "TODO: Generate documentation for [`gegl_enum!`]."] + #[derive(Debug)] + pub enum $enum_name { + $( + #[doc = "TODO: Generate documentation for [`gegl_enum!`]."] + $key, + )* + } + + impl std::fmt::Display for $enum_name { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let display = match self { + $($enum_name::$key => $value,)* + }; + + write!(f, "{display}") + } + } + }; +}