# Snowflaked
[![Crates.io](https://img.shields.io/crates/v/snowflaked)](https://crates.io/crates/snowflaked)
[![Docs.rs](https://img.shields.io/docsrs/snowflaked/latest)](https://docs.rs/snowflaked)
A crate for creating and working with snowflake ids.
## Usage
Add `snowflaked` to your `Cargo.toml`:
```toml
snowflaked = "1.0.0"
```
This crate provides APIs for generating new snowflake ids and defining custom snowflake types.
### Snowflake Generation
Use the `Generator` type to create new snowflake ids:
```rust
use snowflaked::Generator;
let mut generator = Generator::new(0);
let id: u64 = generator.generate();
```
Or use the thread-safe `sync::Generator` type (requires the optional `sync` feature):
```rust
use snowflaked::sync::Generator;
static GENERATOR: Generator = Generator::new(0);
fn generate_id() -> u64 {
GENERATOR.generate()
}
```
### Using custom snowflake types
Custom snowflake types can be defined with the `Snowflake` trait. This trait is currently
implemented for `u64` and `i64` and can be used to define your custom types:
```rust
use snowflaked::Snowflake;
struct UserId(u64);
impl Snowflake for UserId {
fn from_parts(timestamp: u64, instance: u64, sequence: u64) -> Self {
Self(u64::from_parts(timestamp, instance, sequence))
}
fn timestamp(&self) -> u64 {
self.0.timestamp()
}
fn instance(&self) -> u64 {
self.0.instance()
}
fn sequence(&self) -> u64 {
self.0.sequence()
}
}
```
## License
Licensed under either
- [MIT License](https://github.com/MrGunflame/snowflaked-rs/blob/master/LICENSE-MIT)
or
- [Apache License, Version 2.0](https://github.com/MrGunflame/snowflaked-rs/blob/master/LICENSE-APACHE)
at your option.