auto_enums

crates.io docs.rs license rustc build status

A library for to allow multiple return types by automatically generated enum.

This crate is a procedural macro implementation of the features discussions in [rust-lang/rfcs#2414]. This idea is also known as "Anonymous sum types".

This library provides the following attribute macros:

Usage

Add this to your Cargo.toml:

toml [dependencies] auto_enums = "0.7"

Compiler support: requires rustc 1.31+

Examples

#[auto_enum]'s basic feature is to wrap the value returned by the obvious branches (match, if, return, etc..) by an enum that implemented the specified traits.

```rust use autoenums::autoenum;

[auto_enum(Iterator)]

fn foo(x: i32) -> impl Iterator { match x { 0 => 1..10, _ => vec![5, 10].into_iter(), } } ```

#[auto_enum] generates code in two stages.

First, #[auto_enum] will do the following.

Code like this will be generated:

```rust fn foo(x: i32) -> impl Iterator { #[::autoenums::enumderive(Iterator)] enum Enum1<__T1, __T2> { __T1(T1), T2(T2), }

match x {
    0 => __Enum1::__T1(1..10),
    _ => __Enum1::__T2(vec![5, 10].into_iter()),
}

} ```

Next, #[enum_derive] implements the specified traits.

Code like this will be generated

#[auto_enum] can also parse nested arms/branches by using the #[nested] attribute.

```rust use autoenums::autoenum;

[auto_enum(Iterator)]

fn foo(x: i32) -> impl Iterator { match x { 0 => 1..10, #[nested] _ => match x { 1 => vec![5, 10].into_iter(), _ => 0..=x, }, } } ```

See documentation for more details.

Supported traits

#[enum_derive] implements the supported traits and passes unsupported traits to #[derive].

#[enum_derive] supports many of the standard library traits and some popular third-party libraries traits such as [rayon], futures, tokio. See documentation for a complete list of supported traits.

If you want to use traits that are not supported by #[enum_derive], you can use another crate that provides derives macros, or you can define derives macros yourself ([derive_utils] probably can help it).

Basic usage of #[enum_derive]

```rust use autoenums::enumderive;

// #[enum_derive] implements Iterator, and #[derive] implements Clone.

[enum_derive(Iterator, Clone)]

enum Foo { A(A), B(B), } ```

Optional features

type_analysis feature

Analyze return type of function and let binding.

Note that this feature is still experimental.

Examples:

```rust use autoenums::autoenum;

[auto_enum] // there is no need to specify std library's traits

fn func1(x: i32) -> impl Iterator { match x { 0 => 1..10, _ => vec![5, 10].into_iter(), } }

[auto_enum]

fn func2(x: i32) { // Unlike feature(impl_trait_in_bindings), this works on stable compilers. #[autoenum] let _iter: impl Iterator = match x { 0 => Some(0).intoiter(), _ => 0..x, }; } ```

Please be careful if you return another traits with the same name.

Related Projects

License

Licensed under either of Apache License, Version 2.0 or MIT license at your option.

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.