summaryrefslogtreecommitdiffstats
path: root/rust/vendor/nom-derive-impl/src/gen.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 17:39:49 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 17:39:49 +0000
commita0aa2307322cd47bbf416810ac0292925e03be87 (patch)
tree37076262a026c4b48c8a0e84f44ff9187556ca35 /rust/vendor/nom-derive-impl/src/gen.rs
parentInitial commit. (diff)
downloadsuricata-a0aa2307322cd47bbf416810ac0292925e03be87.tar.xz
suricata-a0aa2307322cd47bbf416810ac0292925e03be87.zip
Adding upstream version 1:7.0.3.upstream/1%7.0.3
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'rust/vendor/nom-derive-impl/src/gen.rs')
-rw-r--r--rust/vendor/nom-derive-impl/src/gen.rs48
1 files changed, 48 insertions, 0 deletions
diff --git a/rust/vendor/nom-derive-impl/src/gen.rs b/rust/vendor/nom-derive-impl/src/gen.rs
new file mode 100644
index 0000000..d3ed1aa
--- /dev/null
+++ b/rust/vendor/nom-derive-impl/src/gen.rs
@@ -0,0 +1,48 @@
+use crate::{endian::ParserEndianness, enums::is_input_fieldless_enum, meta};
+use proc_macro2::{Span, TokenStream};
+use syn::*;
+
+mod enums;
+mod fieldless_enums;
+mod generator;
+mod structs;
+
+use enums::GenEnum;
+use fieldless_enums::GenFieldlessEnum;
+pub(crate) use generator::*;
+use structs::GenStruct;
+
+pub(crate) fn gen_impl(
+ ast: &syn::DeriveInput,
+ endianness: ParserEndianness,
+) -> Result<TokenStream> {
+ // eprintln!("ast: {:#?}", ast);
+ let generator: Box<dyn Generator> = match &ast.data {
+ syn::Data::Enum(_) => {
+ // look for a selector
+ let meta = meta::parse_nom_top_level_attribute(&ast.attrs)?;
+ if meta
+ .iter()
+ .any(|m| m.is_type(meta::attr::MetaAttrType::Selector))
+ {
+ Box::new(GenEnum::from_ast(ast, endianness)?)
+ } else {
+ // no selector, try fieldless enum
+ if is_input_fieldless_enum(ast) {
+ Box::new(GenFieldlessEnum::from_ast(ast, endianness)?)
+ } else {
+ return Err(Error::new(
+ ast.ident.span(),
+ "Nom-derive: enums must have a 'selector' attribute",
+ ));
+ }
+ }
+ }
+ syn::Data::Struct(_) => Box::new(GenStruct::from_ast(ast, endianness)?),
+ syn::Data::Union(_) => panic!("Unions not supported"),
+ };
+
+ let impl_tokens = generator.gen_impl()?;
+ // eprintln!("\n***\nglobal_impl: {}\n---\n", impl_tokens);
+ Ok(impl_tokens)
+}