Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 17 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,29 +43,23 @@ Think `struct Outer(Inner);`:

Examples are in [`opaque_typedef_tests/src/`](https://github.com/lo48576/opaque_typedef/tree/develop/opaque_typedef_tests/src).

### 1. Specify "extern crate"
### 1. Add `opaque_typedef` and `opaque_typedef_macros` to `dependencies`

`Cargo.toml`:

```toml
[dependencies]
opaque_typedef = "^0.0.4"
opaque_typedef_macros = "^0.0.4"
```

`lib.rs` or `main.rs`:

```rust
extern crate opaque_typedef;
#[macro_use]
extern crate opaque_typedef_macros;
opaque_typedef = "^0.0.5"
opaque_typedef_macros = "^0.0.5"
```

### 2. Derive `OpaqueTypedef` for sized types, `OpaqueTypedefUnsized` for unsized types

Sized type:

```rust
use opaque_typedef_macros::OpaqueTypedef;

/// My owned string.
#[derive(Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, OpaqueTypedef)]
pub struct MyString(String);
Expand All @@ -74,6 +68,8 @@ pub struct MyString(String);
Unsized type:

```rust
use opaque_typedef_macros::OpaqueTypedefUnsized;

/// My string slice.
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, OpaqueTypedefUnsized)]
#[repr(C)]
Expand All @@ -94,6 +90,8 @@ or traits who might mutate inner value (such as `AddAssign`), you should specify


```rust
use opaque_typedef_macros::OpaqueTypedefUnsized;

/// My string slice.
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, OpaqueTypedefUnsized)]
#[repr(C)]
Expand All @@ -110,6 +108,8 @@ You can specify traits with `#[opaque_typedef(derive(Trait1, Trait2, ...))]`.
For example:

```rust
use opaque_typedef_macros::OpaqueTypedefUnsized;

#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, OpaqueTypedefUnsized)]
#[repr(C)]
#[opaque_typedef(derive(AsciiExt, AsMut(Deref, Self), AsRef(Deref, Self), DefaultRef, Deref,
Expand Down Expand Up @@ -140,6 +140,8 @@ To see full list of shortened notations for "derive"-able items, see
If you specify `Deref`, `DerefMut`, `AsRefDeref` or something related to `Deref`, you can also specify "deref target" by `#[opaque_typedef(deref(...))]`.

```rust
use opaque_typedef_macros::OpaqueTypedef;

/// My owned string.
#[derive(Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, OpaqueTypedef)]
#[opaque_typedef(derive(AsMut(Deref, Inner), AsRef(Deref, Inner), Deref, DerefMut, Display,
Expand Down Expand Up @@ -197,6 +199,8 @@ The example below is taken from [`opaque_typedef_tests/src/even32.rs`](opaque_ty
and [`opaque_typedef_tests/tests/even32.rs`](opaque_typedef_tests/tests/even32.rs).

```rust
use opaque_typedef_macros::OpaqueTypedef;

/// Even `i32`.
#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, OpaqueTypedef)]
#[opaque_typedef(derive(Binary, Deref, Display, FromInner, PartialEq(Inner, InnerRev),
Expand Down Expand Up @@ -264,6 +268,8 @@ The example below is taken from
and [`opaque_typedef_tests/tests/reverse_order.rs`](opaque_typedef_tests/tests/reverse_order.rs).

```rust
use opaque_typedef_macros::OpaqueTypedef;

/// A wrapper type with reverse order.
#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Ord, Hash, OpaqueTypedef)]
#[opaque_typedef(derive(AsciiExt, AsMut(Deref), AsRef(Deref), Binary, Deref, DerefMut, Display,
Expand Down
1 change: 1 addition & 0 deletions opaque_typedef/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
name = "opaque_typedef"
version = "0.0.5"
authors = ["YOSHIOKA Takuma <[email protected]>"]
edition = "2018"
license = "MIT OR Apache-2.0"
readme = "README.md"
description = "Supports defining opaque typedefs"
Expand Down
1 change: 1 addition & 0 deletions opaque_typedef_macros/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
name = "opaque_typedef_macros"
version = "0.0.5"
authors = ["YOSHIOKA Takuma <[email protected]>"]
edition = "2018"
license = "MIT OR Apache-2.0"
readme = "README.md"
description = "Supports defining opaque typedefs"
Expand Down
10 changes: 3 additions & 7 deletions opaque_typedef_macros/src/attrs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,10 @@ fn append_meta_content_by_path(meta: syn::Meta, path: &[&str], vec: &mut Vec<syn
if path.is_empty() {
return;
}
assert!(!path.is_empty());
match meta {
syn::Meta::List(metalist) => {
if metalist.ident == path[0] {
append_meta_items_by_path(metalist.nested, &path[1..], vec);
}
if let syn::Meta::List(metalist) = meta {
if metalist.ident == path[0] {
append_meta_items_by_path(metalist.nested, &path[1..], vec);
}
syn::Meta::Word(..) | syn::Meta::NameValue(..) => return,
}
}

Expand Down
4 changes: 2 additions & 2 deletions opaque_typedef_macros/src/derives/as_ref.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
//! Impl generators for `std::convert::As*` traits.

use proc_macro2::TokenStream;
use quote::ToTokens;
use quote::{quote, ToTokens};

use type_props::TypeProps;
use crate::type_props::TypeProps;

use super::deref::{gen_deref_expr, gen_deref_mut_expr};
use super::Derive;
Expand Down
7 changes: 3 additions & 4 deletions opaque_typedef_macros/src/derives/cmp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,10 @@
use std::borrow::Cow;

use proc_macro2::TokenStream;
use quote::ToTokens;
use syn;
use quote::{quote, ToTokens};

use type_props::{CmpSpec, Sizedness, TypeProps};
use utils::extend_generics;
use crate::type_props::{CmpSpec, Sizedness, TypeProps};
use crate::utils::extend_generics;

use super::Derive;

Expand Down
6 changes: 3 additions & 3 deletions opaque_typedef_macros/src/derives/convert.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
use std::borrow::Cow;

use proc_macro2::TokenStream;
use quote::ToTokens;
use quote::{quote, ToTokens};
use syn;

use type_props::{Sizedness, TypeProps};
use utils::extend_generics;
use crate::type_props::{Sizedness, TypeProps};
use crate::utils::extend_generics;

use super::Derive;

Expand Down
3 changes: 2 additions & 1 deletion opaque_typedef_macros/src/derives/deref.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
//! Impl generators for `std::ops::Deref*` traits.

use proc_macro2::TokenStream;
use quote::quote;

use type_props::TypeProps;
use crate::type_props::TypeProps;

use super::Derive;

Expand Down
7 changes: 3 additions & 4 deletions opaque_typedef_macros/src/derives/fmt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,10 @@
use std::borrow::Cow;

use proc_macro2::TokenStream;
use quote::ToTokens;
use syn;
use quote::{quote, ToTokens};

use type_props::TypeProps;
use utils::extend_generics;
use crate::type_props::TypeProps;
use crate::utils::extend_generics;

use super::Derive;

Expand Down
14 changes: 7 additions & 7 deletions opaque_typedef_macros/src/derives/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@
use std::borrow::Cow;
use std::collections::HashMap;

use lazy_static::lazy_static;
use proc_macro2::TokenStream;
use quote::ToTokens;
use syn;
use quote::{quote, ToTokens};
use strum_macros::{AsRefStr, EnumProperty, EnumString};

use attrs::{get_meta_content_by_path, is_attr_with_path};
use type_props::{Sizedness, TypeProps};
use utils::extend_generics;

use self::ops::OpSpec;
use crate::attrs::{get_meta_content_by_path, is_attr_with_path};
use crate::derives::ops::OpSpec;
use crate::type_props::{Sizedness, TypeProps};
use crate::utils::extend_generics;

mod as_ref;
mod cmp;
Expand Down
8 changes: 4 additions & 4 deletions opaque_typedef_macros/src/derives/ops/binary.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
use std::borrow::Cow;

use proc_macro2::TokenStream;
use quote::ToTokens;
use syn;
use quote::{quote, ToTokens};
use strum_macros::{EnumProperty, EnumString};

use type_props::TypeProps;
use utils::extend_generics;
use crate::type_props::TypeProps;
use crate::utils::extend_generics;

use super::{OperandSpec, OperandTypeSpec, OperandTypeWrapperSpec};

Expand Down
8 changes: 4 additions & 4 deletions opaque_typedef_macros/src/derives/ops/mod.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
//! Impl generators for general unary / binary operator traits.

use proc_macro2::TokenStream;
use quote::ToTokens;
use syn;
use quote::{quote, ToTokens};
use strum_macros::EnumString;

use derives::Derive;
use type_props::TypeProps;
use crate::derives::Derive;
use crate::type_props::TypeProps;

pub mod binary;
pub mod unary;
Expand Down
8 changes: 4 additions & 4 deletions opaque_typedef_macros/src/derives/ops/unary.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
use std::borrow::Cow;

use proc_macro2::TokenStream;
use quote::ToTokens;
use syn;
use quote::{quote, ToTokens};
use strum_macros::{EnumProperty, EnumString};

use type_props::TypeProps;
use utils::extend_generics;
use crate::type_props::TypeProps;
use crate::utils::extend_generics;

use super::{OperandSpec, OperandTypeSpec, OperandTypeWrapperSpec};

Expand Down
11 changes: 1 addition & 10 deletions opaque_typedef_macros/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,21 +1,12 @@
//! Custom derives for easy opaque typedef.
#![recursion_limit = "128"]

#[macro_use]
extern crate lazy_static;
extern crate proc_macro;
extern crate proc_macro2;
#[macro_use]
extern crate quote;
extern crate strum;
#[macro_use]
extern crate strum_macros;
extern crate syn;

use proc_macro2::TokenStream;
use syn::DeriveInput;

use type_props::{Sizedness, TypeProps};
use crate::type_props::{Sizedness, TypeProps};

mod attrs;
mod derives;
Expand Down
8 changes: 4 additions & 4 deletions opaque_typedef_macros/src/type_props/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ use quote::ToTokens;
use syn;
use syn::DeriveInput;

use attrs::{get_meta_content_by_path, has_word_meta, is_attr_with_path};
use derives::Derive;
use type_props::{CmpSpec, DerefSpec, Field, Sizedness, TypeProps, ValidationSpec};
use utils::expect_singleton_iter;
use crate::attrs::{get_meta_content_by_path, has_word_meta, is_attr_with_path};
use crate::derives::Derive;
use crate::type_props::{CmpSpec, DerefSpec, Field, Sizedness, TypeProps, ValidationSpec};
use crate::utils::expect_singleton_iter;

/// Returns `#[repr(..)]` metadata.
fn get_repr_meta(attrs: &[syn::Attribute]) -> Option<syn::Meta> {
Expand Down
8 changes: 3 additions & 5 deletions opaque_typedef_macros/src/type_props/mod.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
//! Type properties.

use proc_macro2::TokenStream;
use quote::ToTokens;
use syn;
use quote::{quote, ToTokens};
use syn::DeriveInput;

use derives::Derive;

use self::builder::TypePropsBuilder;
use crate::derives::Derive;
use crate::type_props::builder::TypePropsBuilder;

mod builder;

Expand Down
1 change: 1 addition & 0 deletions opaque_typedef_tests/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
name = "opaque_typedef_tests"
version = "0.0.5"
authors = ["YOSHIOKA Takuma <[email protected]>"]
edition = "2018"
license = "MIT OR Apache-2.0"
readme = "README.md"

Expand Down
2 changes: 2 additions & 0 deletions opaque_typedef_tests/src/all_eq.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
//! All same.

use opaque_typedef_macros::OpaqueTypedef;

/// All same.
#[derive(Default, Debug, Clone, Copy, Eq, OpaqueTypedef)]
// `IntoInner` cannot be used (and even you can't implement it manually),
Expand Down
2 changes: 2 additions & 0 deletions opaque_typedef_tests/src/atleast2items.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
//! Opaque typedef for `[T]`.

use opaque_typedef_macros::{OpaqueTypedef, OpaqueTypedefUnsized};

/// Local result type.
///
/// If the `opaque_typedef` crate has some kind of bug, this may used instead of
Expand Down
2 changes: 2 additions & 0 deletions opaque_typedef_tests/src/even32.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
//! Opaque typedef for `i32`.

use opaque_typedef_macros::OpaqueTypedef;

/// Even `i32`.
#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, OpaqueTypedef)]
#[opaque_typedef(derive(
Expand Down
2 changes: 2 additions & 0 deletions opaque_typedef_tests/src/int32.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
//! Opaque typedef for `i32`.

use opaque_typedef_macros::OpaqueTypedef;

/// `i32`.
#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, OpaqueTypedef)]
#[opaque_typedef(derive(
Expand Down
4 changes: 0 additions & 4 deletions opaque_typedef_tests/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
//! Tests for `opaque_typedef`.
#![warn(missing_docs)]

extern crate opaque_typedef;
#[macro_use]
extern crate opaque_typedef_macros;

pub mod all_eq;
pub mod atleast2items;
pub mod even32;
Expand Down
2 changes: 2 additions & 0 deletions opaque_typedef_tests/src/my_str.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
//! Opaque typedef for `str`.

use opaque_typedef_macros::{OpaqueTypedef, OpaqueTypedefUnsized};

/// My string slice.
// Note:
// `PartialEqSelfCowAndInner` cannot be used because it generates
Expand Down
2 changes: 2 additions & 0 deletions opaque_typedef_tests/src/reverse_order.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
//! A wrapper type with reverse order.

use opaque_typedef_macros::OpaqueTypedef;

/// A wrapper type with reverse order.
#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, OpaqueTypedef)]
// `IntoInner` cannot be used (and even you can't implement it manually),
Expand Down
3 changes: 0 additions & 3 deletions opaque_typedef_tests/tests/all_eq.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
//! All same.

extern crate opaque_typedef;
extern crate opaque_typedef_tests;

use opaque_typedef_tests::all_eq::AllEq;

mod sized {
Expand Down
Loading