# Biosyn: Mad Science Crate for working with [`syn`](https://crates.io/crates/syn)
## Features
* `biosyn::discriminant` provides utility functions to obtain `std::mem::Discriminant<T>` instances for variants of `syn` enums.
* * Individual `syn` enums can be imported like `biosyn::discriminant::item`
* * Often it's more ergonomic to just use the re-exports from `biosyn::discriminant` directly
* `biosyn::split_by_discriminant` provides integration with the [`split_by_discriminant`](https://crates.io/crates/split_by_discriminant) crate for `syn` enums.
* * Includes implementations of the ExtractFrom trait for `syn` enums on a type [`crate::split_by_discriminant::BiosynExtractor`].
* * Can be optionally disabled, but is enabled by default.
## Usage
### Discriminant helpers
```rust
use biosyn::discriminant::{item_fn_discriminant, item_struct_discriminant};
use std::mem::discriminant;
use syn::{Item, parse_quote};
let item: Item = parse_quote! { fn foo() {} };
assert_eq!(discriminant(&item), item_fn_discriminant());
assert_ne!(discriminant(&item), item_struct_discriminant());
```
### Splitting a `Vec` by variant
```rust
use biosyn::discriminant::item_fn_discriminant;
use biosyn::split_by_discriminant::make_biosyn_extractor;
use syn::{Item, ItemFn, parse_quote};
let mut items: Vec<Item> = vec![
parse_quote! { fn alpha() {} },
parse_quote! { fn beta(x: i32) -> i32 { x } },
parse_quote! { struct NotAFn; },
];
let disc = item_fn_discriminant();
let mut ext = make_biosyn_extractor(&mut items, &[disc]);
let fns: Vec<&mut ItemFn> = ext.extract(disc).expect("found ItemFn group");
assert_eq!(fns.len(), 2);
```
## Optional Features
* `split_by_discriminant` - currently enabled by default