Data structure for parsed contents of bridge module
diff --git a/syntax/file.rs b/syntax/file.rs
index 2243235..f227900 100644
--- a/syntax/file.rs
+++ b/syntax/file.rs
@@ -1,7 +1,10 @@
 use crate::syntax::namespace::Namespace;
 use quote::quote;
 use syn::parse::{Error, Parse, ParseStream, Result};
-use syn::{braced, token, Attribute, Ident, Item, Token, Visibility};
+use syn::{
+    braced, token, Attribute, Ident, Item as RustItem, ItemEnum, ItemForeignMod, ItemStruct,
+    ItemUse, Token, Visibility,
+};
 
 pub struct Module {
     pub namespace: Namespace,
@@ -14,6 +17,14 @@
     pub content: Vec<Item>,
 }
 
+pub enum Item {
+    Struct(ItemStruct),
+    Enum(ItemEnum),
+    ForeignMod(ItemForeignMod),
+    Use(ItemUse),
+    Other(RustItem),
+}
+
 impl Parse for Module {
     fn parse(input: ParseStream) -> Result<Self> {
         let namespace = Namespace::none();
@@ -53,3 +64,16 @@
         })
     }
 }
+
+impl Parse for Item {
+    fn parse(input: ParseStream) -> Result<Self> {
+        let item = input.parse()?;
+        match item {
+            RustItem::Struct(item) => Ok(Item::Struct(item)),
+            RustItem::Enum(item) => Ok(Item::Enum(item)),
+            RustItem::ForeignMod(item) => Ok(Item::ForeignMod(item)),
+            RustItem::Use(item) => Ok(Item::Use(item)),
+            other => Ok(Item::Other(other)),
+        }
+    }
+}
diff --git a/syntax/parse.rs b/syntax/parse.rs
index e195081..117d025 100644
--- a/syntax/parse.rs
+++ b/syntax/parse.rs
@@ -1,4 +1,5 @@
 use crate::syntax::discriminant::DiscriminantSet;
+use crate::syntax::file::Item;
 use crate::syntax::report::Errors;
 use crate::syntax::Atom::*;
 use crate::syntax::{
@@ -11,7 +12,7 @@
 use syn::punctuated::Punctuated;
 use syn::{
     Abi, Attribute, Error, Fields, FnArg, ForeignItem, ForeignItemFn, ForeignItemType,
-    GenericArgument, Ident, Item, ItemEnum, ItemForeignMod, ItemStruct, LitStr, Pat, PathArguments,
+    GenericArgument, Ident, ItemEnum, ItemForeignMod, ItemStruct, LitStr, Pat, PathArguments,
     Result, ReturnType, Token, Type as RustType, TypeBareFn, TypePath, TypeReference, TypeSlice,
 };
 
@@ -33,7 +34,7 @@
             },
             Item::ForeignMod(foreign_mod) => parse_foreign_mod(cx, foreign_mod, &mut apis),
             Item::Use(item) => cx.error(item, error::USE_NOT_ALLOWED),
-            _ => cx.error(item, "unsupported item"),
+            Item::Other(item) => cx.error(item, "unsupported item"),
         }
     }
     apis