diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..4fffb2f
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+/target
+/Cargo.lock
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..7a6a2bd
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "item"
+version = "0.1.0"
+authors = ["David Tolnay <dtolnay@gmail.com>"]
+license = "MIT/Apache-2.0"
+description = "Nom parser for Rust items"
+repository = "https://github.com/dtolnay/item"
+include = ["Cargo.toml", "src/**/*.rs"]
+
+[dependencies]
+nom = "1.2.4"
diff --git a/LICENSE-APACHE b/LICENSE-APACHE
new file mode 100644
index 0000000..16fe87b
--- /dev/null
+++ b/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/LICENSE-MIT b/LICENSE-MIT
new file mode 100644
index 0000000..40b8817
--- /dev/null
+++ b/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2016 The Rust Project Developers
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..1522056
--- /dev/null
+++ b/README.md
@@ -0,0 +1,39 @@
+Nom parser for Rust items
+=========================
+
+Parse Rust structs and enums without a Syntex dependency, intended for use with
+[Macros 1.1](https://github.com/rust-lang/rfcs/blob/master/text/1681-macros-1.1.md).
+
+```toml
+[dependencies]
+item = "0.1"
+```
+
+```rust
+extern crate item;
+
+let raw = "
+    #[derive(Debug, Clone)]
+    pub struct Item {
+        pub ident: Ident,
+        pub attrs: Vec<Attribute>,
+    }
+";
+
+let ast = item::parse(raw).unwrap();
+```
+
+## License
+
+Licensed under either of
+
+ * Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
+ * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
+
+at your option.
+
+### Contribution
+
+Unless you explicitly state otherwise, any contribution intentionally submitted
+for inclusion in this crate by you, as defined in the Apache-2.0 license, shall
+be dual licensed as above, without any additional terms or conditions.
diff --git a/src/lib.rs b/src/lib.rs
new file mode 100644
index 0000000..52eff8e
--- /dev/null
+++ b/src/lib.rs
@@ -0,0 +1,509 @@
+#[macro_use]
+extern crate nom;
+
+use nom::IResult;
+use nom::multispace as space;
+
+use std::str;
+
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub struct Item {
+    pub ident: Ident,
+    pub vis: Visibility,
+    pub attrs: Vec<Attribute>,
+    pub generics: Generics,
+    pub body: Body,
+}
+
+pub type Ident = String;
+
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub struct Attribute {
+    pub value: MetaItem,
+    pub is_sugared_doc: bool,
+}
+
+/// A compile-time attribute item.
+///
+/// E.g. `#[test]`, `#[derive(..)]` or `#[feature = "foo"]`
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub enum MetaItem {
+    /// Word meta item.
+    ///
+    /// E.g. `test` as in `#[test]`
+    Word(Ident),
+    /// List meta item.
+    ///
+    /// E.g. `derive(..)` as in `#[derive(..)]`
+    List(Ident, Vec<MetaItem>),
+    /// Name value meta item.
+    ///
+    /// E.g. `feature = "foo"` as in `#[feature = "foo"]`
+    NameValue(Ident, String),
+}
+
+#[derive(Debug, Clone, Eq, PartialEq, Default)]
+pub struct Generics {
+    pub lifetimes: Vec<LifetimeDef>,
+    pub ty_params: Vec<TyParam>,
+    pub where_clause: Vec<WherePredicate>,
+}
+
+/// A single predicate in a `where` clause
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub enum WherePredicate {
+    /// A type binding, e.g. `for<'c> Foo: Send+Clone+'c`
+    BoundPredicate(WhereBoundPredicate),
+    /// A lifetime predicate, e.g. `'a: 'b+'c`
+    RegionPredicate(WhereRegionPredicate),
+}
+
+/// A type bound.
+///
+/// E.g. `for<'c> Foo: Send+Clone+'c`
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub struct WhereBoundPredicate {
+    /// Any lifetimes from a `for` binding
+    pub bound_lifetimes: Vec<LifetimeDef>,
+    /// The type being bounded
+    pub bounded_ty: Ty,
+    /// Trait and lifetime bounds (`Clone+Send+'static`)
+    pub bounds: Vec<TyParamBound>,
+}
+
+/// A lifetime predicate.
+///
+/// E.g. `'a: 'b+'c`
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub struct WhereRegionPredicate {
+    pub lifetime: Lifetime,
+    pub bounds: Vec<Lifetime>,
+}
+
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub struct LifetimeDef {
+    pub lifetime: Lifetime,
+    pub bounds: Vec<Lifetime>,
+}
+
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub struct Lifetime {
+    pub ident: Ident,
+}
+
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub struct TyParam {
+    pub ident: Ident,
+    pub bounds: Vec<TyParamBound>,
+    pub default: Option<Ty>,
+}
+
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub enum TyParamBound {
+    MaybeSized,
+    Region(Lifetime),
+    Trait(PolyTraitRef),
+}
+
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub struct PolyTraitRef {
+    /// The `'a` in `<'a> Foo<&'a T>`
+    pub bound_lifetimes: Vec<LifetimeDef>,
+    /// The `Foo<&'a T>` in `<'a> Foo<&'a T>`
+    pub trait_ref: Path,
+}
+
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub struct Path {
+    pub global: bool,
+    pub segments: Vec<PathSegment>,
+}
+
+/// A segment of a path: an identifier, an optional lifetime, and a set of types.
+///
+/// E.g. `std`, `String` or `Box<T>`
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub struct PathSegment {
+    pub ident: Ident,
+    pub parameters: PathParameters,
+}
+
+impl PathSegment {
+    pub fn ident(ident: Ident) -> Self {
+        PathSegment {
+            ident: ident,
+            parameters: PathParameters::none(),
+        }
+    }
+}
+
+/// Parameters of a path segment.
+///
+/// E.g. `<A, B>` as in `Foo<A, B>` or `(A, B)` as in `Foo(A, B)`
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub enum PathParameters {
+    /// The `<'a, A, B, C>` in `foo::bar::baz::<'a, A, B, C>`
+    AngleBracketed(AngleBracketedParameterData),
+    /// The `(A, B)` and `C` in `Foo(A, B) -> C`
+    Parenthesized(ParenthesizedParameterData),
+}
+
+impl PathParameters {
+    pub fn none() -> Self {
+        PathParameters::AngleBracketed(AngleBracketedParameterData::default())
+    }
+}
+
+/// A path like `Foo<'a, T>`
+#[derive(Debug, Clone, Eq, PartialEq, Default)]
+pub struct AngleBracketedParameterData {
+    /// The lifetime parameters for this path segment.
+    pub lifetimes: Vec<Lifetime>,
+    /// The type parameters for this path segment, if present.
+    pub types: Vec<Ty>,
+    /// Bindings (equality constraints) on associated types, if present.
+    ///
+    /// E.g., `Foo<A=Bar>`.
+    pub bindings: Vec<TypeBinding>,
+}
+
+/// Bind a type to an associated type: `A=Foo`.
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub struct TypeBinding {
+    pub ident: Ident,
+    pub ty: Ty,
+}
+
+/// A path like `Foo(A,B) -> C`
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub struct ParenthesizedParameterData {
+    /// `(A, B)`
+    pub inputs: Vec<Ty>,
+    /// `C`
+    pub output: Option<Ty>,
+}
+
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub enum Body {
+    Enum(Vec<Variant>),
+    Struct(Style, Vec<Field>),
+}
+
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub struct Variant {
+    pub ident: Ident,
+    pub attrs: Vec<Attribute>,
+    pub style: Style,
+    pub fields: Vec<Field>,
+}
+
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub enum Style {
+    Struct,
+    Tuple,
+    Unit,
+}
+
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub struct Field {
+    pub ident: Option<Ident>,
+    pub vis: Visibility,
+    pub attrs: Vec<Attribute>,
+    pub ty: Ty,
+}
+
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub enum Visibility {
+    Public,
+    Inherited,
+}
+
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub enum Ty {
+    /// A variable-length array (`[T]`)
+    Vec(Box<Ty>),
+    /// A fixed length array (`[T; n]`)
+    FixedLengthVec(Box<Ty>, usize),
+    /// A raw pointer (`*const T` or `*mut T`)
+    Ptr(Box<MutTy>),
+    /// A reference (`&'a T` or `&'a mut T`)
+    Rptr(Option<Lifetime>, Box<MutTy>),
+    /// A bare function (e.g. `fn(usize) -> bool`)
+    BareFn(Box<BareFnTy>),
+    /// The never type (`!`)
+    Never,
+    /// A tuple (`(A, B, C, D, ...)`)
+    Tup(Vec<Ty>),
+    /// A path (`module::module::...::Type`), optionally
+    /// "qualified", e.g. `<Vec<T> as SomeTrait>::SomeType`.
+    ///
+    /// Type parameters are stored in the Path itself
+    Path(Option<QSelf>, Path),
+    /// Something like `A+B`. Note that `B` must always be a path.
+    ObjectSum(Box<Ty>, Vec<TyParamBound>),
+    /// A type like `for<'a> Foo<&'a Bar>`
+    PolyTraitRef(Vec<TyParamBound>),
+    /// An `impl TraitA+TraitB` type.
+    ImplTrait(Vec<TyParamBound>),
+    /// No-op; kept solely so that we can pretty-print faithfully
+    Paren(Box<Ty>),
+    /// TyKind::Infer means the type should be inferred instead of it having been
+    /// specified. This can appear anywhere in a type.
+    Infer,
+}
+
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub struct MutTy {
+    pub ty: Ty,
+    pub mutbl: Mutability,
+}
+
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub enum Mutability {
+    Mutable,
+    Immutable,
+}
+
+/// The explicit Self type in a "qualified path". The actual
+/// path, including the trait and the associated item, is stored
+/// separately. `position` represents the index of the associated
+/// item qualified with this Self type.
+///
+/// ```rust,ignore
+/// <Vec<T> as a::b::Trait>::AssociatedItem
+///  ^~~~~     ~~~~~~~~~~~~~~^
+///  ty        position = 3
+///
+/// <Vec<T>>::AssociatedItem
+///  ^~~~~    ^
+///  ty       position = 0
+/// ```
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub struct QSelf {
+    pub ty: Box<Ty>,
+    pub position: usize
+}
+
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub struct BareFnTy {
+    pub lifetimes: Vec<LifetimeDef>,
+    pub decl: FnDecl
+}
+
+/// Header (not the body) of a function declaration.
+///
+/// E.g. `fn foo(bar: baz)`
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub struct FnDecl {
+    pub inputs: Vec<Arg>,
+    pub output: FunctionRetTy,
+}
+
+/// An argument in a function header.
+///
+/// E.g. `bar: usize` as in `fn foo(bar: usize)`
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub struct Arg {
+    pub pat: Option<Ident>,
+    pub ty: Ty,
+}
+
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub enum FunctionRetTy {
+    /// Return type is not specified.
+    ///
+    /// Functions default to `()` and
+    /// closures default to inference. Span points to where return
+    /// type would be inserted.
+    Default,
+    /// Everything else
+    Ty(Ty),
+}
+
+named!(attribute<&str, Attribute>, chain!(
+    space? ~
+    tag_s!("#[") ~
+    space? ~
+    first: word ~
+    space? ~
+    tag_s!("(") ~
+    inner: separated_list!(tag_s!(", "), word) ~
+    tag_s!(")") ~
+    space? ~
+    tag_s!("]") ,
+    || { return  Attribute {
+            value: MetaItem::List(first.to_string(), inner.into_iter().map(|w|
+                MetaItem::Word(w.to_string())
+            ).collect()),
+            is_sugared_doc: false,
+        } }
+));
+
+named!(visibility<&str, Visibility>,
+    map!(opt!(terminated!(tag_s!("pub"), space)), |tag| match tag {
+        Some(_) => Visibility::Public,
+        None => Visibility::Inherited,
+    })
+);
+
+fn ident_ch(ch: char) -> bool {
+    ch.is_alphanumeric() || ch == '_'
+}
+
+named!(word<&str, Ident>, map!(take_while1_s!(ident_ch), String::from));
+
+named!(path_segment<&str, PathSegment>, alt!(
+    chain!(
+        ident: word ~
+        space? ~
+        tag_s!("<") ~
+        types: many0!(ty) ~
+        space? ~
+        tag_s!(">") ,
+        || {
+            PathSegment {
+                ident: ident,
+                parameters: PathParameters::AngleBracketed(
+                    AngleBracketedParameterData {
+                        lifetimes: Vec::new(),
+                        types: types,
+                        bindings: Vec::new(),
+                    }
+                ),
+            }
+        }
+    )
+    |
+    map!(word, |n| PathSegment::ident(n))
+));
+
+named!(ty<&str, Ty>, chain!(
+    global: tag_s!("::")? ~
+    segments: separated_nonempty_list!(tag_s!("::"), path_segment) ,
+    || {
+        Ty::Path(None, Path {
+            global: global.is_some(),
+            segments: segments,
+        })
+    }
+));
+
+/*
+    /// A variable-length array (`[T]`)
+    Vec(Box<Ty>),
+    /// A fixed length array (`[T; n]`)
+    FixedLengthVec(Box<Ty>, usize),
+    /// A raw pointer (`*const T` or `*mut T`)
+    Ptr(Box<MutTy>),
+    /// A reference (`&'a T` or `&'a mut T`)
+    Rptr(Option<Lifetime>, Box<MutTy>),
+    /// A bare function (e.g. `fn(usize) -> bool`)
+    BareFn(Box<BareFnTy>),
+    /// The never type (`!`)
+    Never,
+    /// A tuple (`(A, B, C, D, ...)`)
+    Tup(Vec<Ty>),
+    /// A path (`module::module::...::Type`), optionally
+    /// "qualified", e.g. `<Vec<T> as SomeTrait>::SomeType`.
+    ///
+    /// Type parameters are stored in the Path itself
+    Path(Option<QSelf>, Path),
+    /// Something like `A+B`. Note that `B` must always be a path.
+    ObjectSum(Box<Ty>, Vec<TyParamBound>),
+    /// A type like `for<'a> Foo<&'a Bar>`
+    PolyTraitRef(Vec<TyParamBound>),
+    /// An `impl TraitA+TraitB` type.
+    ImplTrait(Vec<TyParamBound>),
+    /// No-op; kept solely so that we can pretty-print faithfully
+    Paren(Box<Ty>),
+    /// TyKind::Infer means the type should be inferred instead of it having been
+    /// specified. This can appear anywhere in a type.
+    Infer,
+*/
+
+named!(field<&str, Field>, chain!(
+    space? ~
+    vis: visibility ~
+    ident: word ~
+    space? ~
+    tag_s!(":") ~
+    space? ~
+    ty: ty ,
+    || {
+        Field {
+            ident: Some(ident),
+            vis: vis,
+            attrs: Vec::new(),
+            ty: ty,
+        }
+    }
+));
+
+named!(struct_body<&str, Body>, alt!(
+    chain!(
+        tag_s!("{") ~
+        fields: separated_list!(tag_s!(","), field) ~
+        space? ~
+        tag_s!(",")? ~
+        space? ~
+        tag_s!("}") ,
+        || { Body::Struct(Style::Struct, fields) }
+    )
+    |
+    chain!(
+        tag_s!("(") ~
+        separated_list!(tag_s!(","), chain!(
+            space? ~
+            vis: visibility ~
+            ty: ty ,
+            || {}
+        )) ~
+        space? ~
+        tag_s!(",")? ~
+        space? ~
+        tag_s!(")") ,
+        || { Body::Struct(Style::Tuple, Vec::new()) }
+    )
+    |
+    map!(tag_s!(";"), |_| Body::Struct(Style::Unit, Vec::new()))
+));
+
+named!(item<&str, Item>, chain!(
+    attrs: many0!(attribute) ~
+    space? ~
+    vis: visibility ~
+    tag_s!("struct") ~
+    space ~
+    ident: word ~
+    space? ~
+    body: struct_body ~
+    space? ,
+    || { return Item {
+            ident: ident,
+            vis: vis,
+            attrs: attrs,
+            generics: Generics::default(),
+            body: body,
+        } }
+));
+
+pub fn parse(input: &str) -> Result<Item, String> {
+    match item(input) {
+        IResult::Done(rest, ast) => {
+            if rest.is_empty() {
+                Ok(ast)
+            } else {
+                Err(format!("more than a single input item: {:?}", rest))
+            }
+        }
+        IResult::Error(nom::Err::Code(kind)) |
+        IResult::Error(nom::Err::Node(kind, _)) => {
+            Err(format!("failed to parse {:?}", kind))
+        }
+        IResult::Error(nom::Err::Position(kind, pos)) |
+        IResult::Error(nom::Err::NodePosition(kind, pos, _)) => {
+            Err(format!("failed to parse {:?}: {:?}", kind, pos))
+        }
+        IResult::Incomplete(_) => Err("incomplete input item".to_string()),
+    }
+}
diff --git a/tests/test.rs b/tests/test.rs
new file mode 100644
index 0000000..9268495
--- /dev/null
+++ b/tests/test.rs
@@ -0,0 +1,64 @@
+extern crate item;
+use item::*;
+
+fn simple_ty(ident: &str) -> Ty {
+    Ty::Path(None, Path {
+        global: false,
+        segments: vec![PathSegment::ident(ident.to_string())],
+    })
+}
+#[test]
+fn test_struct() {
+    let raw = "
+        #[derive(Debug, Clone)]
+        pub struct Item {
+            pub ident: Ident,
+            pub attrs: Vec<Attribute>,
+        }
+    ";
+
+    let expected = Item {
+        ident: "Item".to_string(),
+        vis: Visibility::Public,
+        attrs: vec![
+            Attribute {
+                value: MetaItem::List("derive".to_string(), vec![
+                    MetaItem::Word("Debug".to_string()),
+                    MetaItem::Word("Clone".to_string()),
+                ]),
+                is_sugared_doc: false,
+            },
+        ],
+        generics: Generics::default(),
+        body: Body::Struct(Style::Struct, vec![
+            Field {
+                ident: Some("ident".to_string()),
+                vis: Visibility::Public,
+                attrs: Vec::new(),
+                ty: simple_ty("Ident"),
+            },
+            Field {
+                ident: Some("attrs".to_string()),
+                vis: Visibility::Public,
+                attrs: Vec::new(),
+                ty: Ty::Path(None, Path {
+                    global: false,
+                    segments: vec![
+                        PathSegment {
+                            ident: "Vec".to_string(),
+                            parameters: PathParameters::AngleBracketed(
+                                AngleBracketedParameterData {
+                                    lifetimes: Vec::new(),
+                                    types: vec![simple_ty("Attribute")],
+                                    bindings: Vec::new(),
+                                },
+                            ),
+                        }
+                    ],
+                }),
+            },
+        ]),
+    };
+
+    assert_eq!(expected, parse(raw).unwrap());
+}
