diff --git a/README.md b/README.md index 3568343..9b1ba22 100644 --- a/README.md +++ b/README.md @@ -23,10 +23,17 @@ derive-new = "0.5" Include the macro: -```rust -#[macro_use] -extern crate derive_new; -``` +* Rust Edition 2015 + + ```rust + #[macro_use] + extern crate derive_new; + ``` + +* Rust Edition 2018 + ```rust + use derive_new::new; + ``` Generating constructor for a simple struct: diff --git a/src/lib.rs b/src/lib.rs index 5d1eef8..206ab1c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,110 +1,110 @@ -//!# A custom derive implementation for `#[derive(new)]` +//! # A custom derive implementation for `#[derive(new)]` //! -//!A `derive(new)` attribute creates a `new` constructor function for the annotated -//!type. That function takes an argument for each field in the type giving a -//!trivial constructor. This is useful since as your type evolves you can make the -//!constructor non-trivial (and add or remove fields) without changing client code -//!(i.e., without breaking backwards compatibility). It is also the most succinct -//!way to initialise a struct or an enum. +//! A `derive(new)` attribute creates a `new` constructor function for the annotated +//! type. That function takes an argument for each field in the type giving a +//! trivial constructor. This is useful since as your type evolves you can make the +//! constructor non-trivial (and add or remove fields) without changing client code +//! (i.e., without breaking backwards compatibility). It is also the most succinct +//! way to initialise a struct or an enum. //! -//!Implementation uses macros 1.1 custom derive (which works in stable Rust from -//!1.15 onwards). +//! Implementation uses macros 1.1 custom derive (which works in stable Rust from +//! 1.15 onwards). //! -//!## Examples +//! ## Examples //! -//!Cargo.toml: +//! Cargo.toml: //! -//!```toml -//![dependencies] -//!derive-new = "0.5" -//!``` +//! ```toml +//! [dependencies] +//! derive-new = "0.5" +//! ``` //! -//!Include the macro: +//! Include the macro: //! -//!```rust -//!#[macro_use] -//!extern crate derive_new; -//!fn main() {} -//!``` +//! ```rust +//! use derive_new::new; +//! +//! fn main() {} +//! ``` //! -//!Generating constructor for a simple struct: +//! Generating constructor for a simple struct: //! -//!```rust -//!#[macro_use] -//!extern crate derive_new; -//!#[derive(new)] -//!struct Bar { -//! a: i32, -//! b: String, -//!} +//! ```rust +//! use derive_new::new; +//! +//! #[derive(new)] +//! struct Bar { +//! a: i32, +//! b: String, +//! } //! -//!fn main() { -//! let _ = Bar::new(42, "Hello".to_owned()); -//!} -//!``` +//! fn main() { +//! let _ = Bar::new(42, "Hello".to_owned()); +//! } +//! ``` //! -//!Default values can be specified either via `#[new(default)]` attribute which removes -//!the argument from the constructor and populates the field with `Default::default()`, -//!or via `#[new(value = "..")]` which initializes the field with a given expression: +//! Default values can be specified either via `#[new(default)]` attribute which removes +//! the argument from the constructor and populates the field with `Default::default()`, +//! or via `#[new(value = "..")]` which initializes the field with a given expression: //! -//!```rust -//!#[macro_use] -//!extern crate derive_new; -//!#[derive(new)] -//!struct Foo { -//! x: bool, -//! #[new(value = "42")] -//! y: i32, -//! #[new(default)] -//! z: Vec, -//!} +//! ```rust +//! use derive_new::new; +//! +//! #[derive(new)] +//! struct Foo { +//! x: bool, +//! #[new(value = "42")] +//! y: i32, +//! #[new(default)] +//! z: Vec, +//! } //! -//!fn main() { -//! let _ = Foo::new(true); -//!} -//!``` +//! fn main() { +//! let _ = Foo::new(true); +//! } +//! ``` //! -//!Generic types are supported; in particular, `PhantomData` fields will be not -//!included in the argument list and will be intialized automatically: +//! Generic types are supported; in particular, `PhantomData` fields will be not +//! included in the argument list and will be intialized automatically: //! -//!```rust -//!#[macro_use] -//!extern crate derive_new; -//!use std::marker::PhantomData; +//! ```rust +//! use derive_new::new; +//! +//! use std::marker::PhantomData; //! -//!#[derive(new)] -//!struct Generic<'a, T: Default, P> { -//! x: &'a str, -//! y: PhantomData

, -//! #[new(default)] -//! z: T, -//!} +//! #[derive(new)] +//! struct Generic<'a, T: Default, P> { +//! x: &'a str, +//! y: PhantomData

, +//! #[new(default)] +//! z: T, +//! } //! -//!fn main() { -//! let _ = Generic::::new("Hello"); -//!} -//!``` +//! fn main() { +//! let _ = Generic::::new("Hello"); +//! } +//! ``` //! -//!For enums, one constructor method is generated for each variant, with the type -//!name being converted to snake case; otherwise, all features supported for -//!structs work for enum variants as well: +//! For enums, one constructor method is generated for each variant, with the type +//! name being converted to snake case; otherwise, all features supported for +//! structs work for enum variants as well: //! -//!```rust -//!#[macro_use] -//!extern crate derive_new; -//!#[derive(new)] -//!enum Enum { -//! FirstVariant, -//! SecondVariant(bool, #[new(default)] u8), -//! ThirdVariant { x: i32, #[new(value = "vec![1]")] y: Vec } -//!} +//! ```rust +//! use derive_new::new; +//! +//! #[derive(new)] +//! enum Enum { +//! FirstVariant, +//! SecondVariant(bool, #[new(default)] u8), +//! ThirdVariant { x: i32, #[new(value = "vec![1]")] y: Vec } +//! } //! -//!fn main() { -//! let _ = Enum::new_first_variant(); -//! let _ = Enum::new_second_variant(true); -//! let _ = Enum::new_third_variant(42); -//!} -//!``` +//! fn main() { +//! let _ = Enum::new_first_variant(); +//! let _ = Enum::new_second_variant(true); +//! let _ = Enum::new_third_variant(42); +//! } +//! ``` #![crate_type = "proc-macro"] #![recursion_limit = "192"]