summaryrefslogtreecommitdiff
path: root/macros/src/lib.rs
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2023-03-13 21:39:38 +0100
committerLaurenz <laurmaedje@gmail.com>2023-03-13 21:40:06 +0100
commit880b1847bd4170ce80be5781c2163ba085cdcaff (patch)
tree3fbfdb70cb04c4922f0ec9e3f29f2c63d11d753b /macros/src/lib.rs
parentcb3c263c4a67f4d361dbdb5048a1c073bd1fff96 (diff)
Derive `Cast` for enums
Diffstat (limited to 'macros/src/lib.rs')
-rw-r--r--macros/src/lib.rs11
1 files changed, 10 insertions, 1 deletions
diff --git a/macros/src/lib.rs b/macros/src/lib.rs
index 889eaa7b..fafe8eea 100644
--- a/macros/src/lib.rs
+++ b/macros/src/lib.rs
@@ -15,7 +15,7 @@ use quote::quote;
use syn::ext::IdentExt;
use syn::parse::{Parse, ParseStream, Parser};
use syn::punctuated::Punctuated;
-use syn::{parse_quote, Ident, Result, Token};
+use syn::{parse_quote, DeriveInput, Ident, Result, Token};
use self::util::*;
@@ -35,6 +35,15 @@ pub fn node(stream: BoundaryStream, item: BoundaryStream) -> BoundaryStream {
.into()
}
+/// Implement `Cast` for an enum.
+#[proc_macro_derive(Cast, attributes(string))]
+pub fn cast(item: BoundaryStream) -> BoundaryStream {
+ let item = syn::parse_macro_input!(item as DeriveInput);
+ castable::cast(item)
+ .unwrap_or_else(|err| err.to_compile_error())
+ .into()
+}
+
/// Implement `Cast` and optionally `Type` for a type.
#[proc_macro]
pub fn cast_from_value(stream: BoundaryStream) -> BoundaryStream {