Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
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
11 changes: 11 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ Available library features:
- `chrono-tz`
- `http`
- `ulid`
- `ferroid`
- `uuid`
- `bigdecimal` (via `bigdecimal-rs`)
- `rust_decimal`
Expand Down Expand Up @@ -463,6 +464,16 @@ Bic();
Isin();
```

### Ferroid

```rust
FerroidULID();
FerroidTwitterId();
FerroidInstagramId();
FerroidMastodonId();
FerroidDiscordId();
```

### UUID

```rust
Expand Down
1 change: 1 addition & 0 deletions fake/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ http = { version = "1", optional = true }
semver = { version = "1", optional = true }
serde_json = { version = "1", optional = true }
ulid = { version = "1", optional = true }
ferroid = { version = "0.6", optional = true, features = ["std", "alloc", "snowflake", "ulid", "base32"] }
uuid = { version = "1", features = [
"v1",
"v3",
Expand Down
11 changes: 11 additions & 0 deletions fake/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ Available library features:
- `chrono-tz`
- `http`
- `ulid`
- `ferroid`
- `uuid`
- `bigdecimal` (via `bigdecimal-rs`)
- `rust_decimal`
Expand Down Expand Up @@ -454,6 +455,16 @@ Bic();
Isin();
```

### Ferroid

```rust
FerroidULID();
FerroidTwitterId();
FerroidInstagramId();
FerroidMastodonId();
FerroidDiscordId();
```

### UUID

```rust
Expand Down
43 changes: 43 additions & 0 deletions fake/examples/derive.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ use fake::faker::boolean::en::*;
use fake::faker::company::en::*;
use fake::faker::lorem::en::*;
use fake::faker::name::en::*;
use fake::ferroid::*;
use fake::utils::{either, WrappedVal};
use fake::uuid::UUIDv4;
use fake::Dummy;
Expand Down Expand Up @@ -125,6 +126,42 @@ struct FakerWrapperStruct {
pub val: String,
}

#[derive(Debug, Dummy)]
struct LogEntry {
#[dummy(faker = "FerroidULID")]
pub ulid: ferroid::ULID,

#[dummy(faker = "FerroidTwitterId")]
pub twitter_id: ferroid::SnowflakeTwitterId,

#[dummy(faker = "FerroidInstagramId")]
pub instagram_id: ferroid::SnowflakeInstagramId,

#[dummy(faker = "FerroidMastodonId")]
pub mastodon_id: ferroid::SnowflakeMastodonId,

#[dummy(faker = "FerroidDiscordId")]
pub discord_id: ferroid::SnowflakeDiscordId,
}

#[derive(Debug, Dummy)]
struct LogEntryBase32 {
#[dummy(faker = "FerroidULID")]
pub ulid: String,

#[dummy(faker = "FerroidTwitterId")]
pub twitter_id: String,

#[dummy(faker = "FerroidInstagramId")]
pub instagram_id: String,

#[dummy(faker = "FerroidMastodonId")]
pub mastodon_id: String,

#[dummy(faker = "FerroidDiscordId")]
pub discord_id: String,
}

fn main() {
let order: Order = Faker.fake();
println!("{:#?}", order);
Expand Down Expand Up @@ -168,4 +205,10 @@ fn main() {

let v: FakerWrapperStruct = Faker.fake();
println!("{:#?}", v);

let v: LogEntry = Faker.fake();
println!("{:#?}", v);

let v: LogEntryBase32 = Faker.fake();
println!("{:#?}", v);
}
41 changes: 41 additions & 0 deletions fake/examples/fakers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -507,6 +507,44 @@ fn barcode_faker() {
println!("{}", val);
}

#[cfg(feature = "ferroid")]
fn ferroid_faker() {
use fake::ferroid::*;
use ferroid::{
SnowflakeDiscordId, SnowflakeInstagramId, SnowflakeMastodonId, SnowflakeTwitterId, ULID,
};

let val: ULID = FerroidULID.fake();
println!("{:?}", val);

let val: String = FerroidULID.fake();
println!("{} (ULID)", val);

let val: SnowflakeTwitterId = FerroidTwitterId.fake();
println!("{:?}", val);

let val: String = FerroidTwitterId.fake();
println!("{} (SnowflakeTwitterId)", val);

let val: SnowflakeInstagramId = FerroidInstagramId.fake();
println!("{:?}", val);

let val: String = FerroidInstagramId.fake();
println!("{} (SnowflakeInstagramId)", val);

let val: SnowflakeDiscordId = FerroidDiscordId.fake();
println!("{:?}", val);

let val: String = FerroidDiscordId.fake();
println!("{} (SnowflakeDiscordId)", val);

let val: SnowflakeMastodonId = FerroidMastodonId.fake();
println!("{:?}", val);

let val: String = FerroidMastodonId.fake();
println!("{} (SnowflakeMastodonId)", val);
}

#[cfg(feature = "uuid")]
fn uuid_faker() {
use fake::uuid::*;
Expand Down Expand Up @@ -626,6 +664,9 @@ fn main() {
#[cfg(feature = "chrono")]
chrono_faker();

#[cfg(feature = "ferroid")]
ferroid_faker();

#[cfg(feature = "uuid")]
uuid_faker();

Expand Down
135 changes: 135 additions & 0 deletions fake/src/impls/ferroid/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
//! Fake _ferroid_ generation.

use ferroid::{
Base32SnowExt, Base32UlidExt, SnowflakeDiscordId, SnowflakeInstagramId, SnowflakeMastodonId,
SnowflakeTwitterId, ULID,
};

use crate::{Dummy, Faker};

pub struct FerroidULID;
pub struct FerroidTwitterId;
pub struct FerroidDiscordId;
pub struct FerroidMastodonId;
pub struct FerroidInstagramId;

// --- ULID ---
impl Dummy<Faker> for ULID {
fn dummy_with_rng<R: rand::Rng + ?Sized>(_: &Faker, rng: &mut R) -> Self {
let time_part: u128 = rng.random_range(0..(1 << ULID::TIMESTAMP_BITS));
let rand_part: u128 = rng.random_range(0..(1 << ULID::RANDOM_BITS));
ULID::from(time_part, rand_part)
}
}
impl Dummy<FerroidULID> for ULID {
fn dummy_with_rng<R: rand::Rng + ?Sized>(_: &FerroidULID, rng: &mut R) -> Self {
let time_part: u128 = rng.random_range(0..(1 << ULID::TIMESTAMP_BITS));
let rand_part: u128 = rng.random_range(0..(1 << ULID::RANDOM_BITS));
ULID::from(time_part, rand_part)
}
}
impl Dummy<FerroidULID> for String {
fn dummy_with_rng<R: rand::Rng + ?Sized>(config: &FerroidULID, rng: &mut R) -> Self {
ULID::dummy_with_rng(config, rng).encode().to_string()
}
}

// --- SnowflakeTwitterId ---
impl Dummy<Faker> for SnowflakeTwitterId {
fn dummy_with_rng<R: rand::Rng + ?Sized>(_: &Faker, rng: &mut R) -> Self {
let timestamp: u64 = rng.random_range(0..(1 << SnowflakeTwitterId::TIMESTAMP_BITS));
let machine_id: u64 = rng.random_range(0..(1 << SnowflakeTwitterId::MACHINE_ID_BITS));
let sequence: u64 = rng.random_range(0..(1 << SnowflakeTwitterId::SEQUENCE_BITS));
SnowflakeTwitterId::from(timestamp, machine_id, sequence)
}
}
impl Dummy<FerroidTwitterId> for SnowflakeTwitterId {
fn dummy_with_rng<R: rand::Rng + ?Sized>(_: &FerroidTwitterId, rng: &mut R) -> Self {
let timestamp: u64 = rng.random_range(0..(1 << SnowflakeTwitterId::TIMESTAMP_BITS));
let machine_id: u64 = rng.random_range(0..(1 << SnowflakeTwitterId::MACHINE_ID_BITS));
let sequence: u64 = rng.random_range(0..(1 << SnowflakeTwitterId::SEQUENCE_BITS));
SnowflakeTwitterId::from(timestamp, machine_id, sequence)
}
}
impl Dummy<FerroidTwitterId> for String {
fn dummy_with_rng<R: rand::Rng + ?Sized>(config: &FerroidTwitterId, rng: &mut R) -> Self {
SnowflakeTwitterId::dummy_with_rng(config, rng)
.encode()
.to_string()
}
}

// --- SnowflakeDiscordId ---
impl Dummy<Faker> for SnowflakeDiscordId {
fn dummy_with_rng<R: rand::Rng + ?Sized>(_: &Faker, rng: &mut R) -> Self {
let timestamp: u64 = rng.random_range(0..(1 << SnowflakeDiscordId::TIMESTAMP_BITS));
let machine_id: u64 = rng.random_range(0..(1 << SnowflakeDiscordId::MACHINE_ID_BITS));
let sequence: u64 = rng.random_range(0..(1 << SnowflakeDiscordId::SEQUENCE_BITS));
SnowflakeDiscordId::from(timestamp, machine_id, sequence)
}
}
impl Dummy<FerroidDiscordId> for SnowflakeDiscordId {
fn dummy_with_rng<R: rand::Rng + ?Sized>(_: &FerroidDiscordId, rng: &mut R) -> Self {
let timestamp: u64 = rng.random_range(0..(1 << SnowflakeDiscordId::TIMESTAMP_BITS));
let machine_id: u64 = rng.random_range(0..(1 << SnowflakeDiscordId::MACHINE_ID_BITS));
let sequence: u64 = rng.random_range(0..(1 << SnowflakeDiscordId::SEQUENCE_BITS));
SnowflakeDiscordId::from(timestamp, machine_id, sequence)
}
}
impl Dummy<FerroidDiscordId> for String {
fn dummy_with_rng<R: rand::Rng + ?Sized>(config: &FerroidDiscordId, rng: &mut R) -> Self {
SnowflakeDiscordId::dummy_with_rng(config, rng)
.encode()
.to_string()
}
}

// --- SnowflakeMastodonId ---
impl Dummy<Faker> for SnowflakeMastodonId {
fn dummy_with_rng<R: rand::Rng + ?Sized>(_: &Faker, rng: &mut R) -> Self {
let timestamp: u64 = rng.random_range(0..(1 << SnowflakeMastodonId::TIMESTAMP_BITS));
let machine_id: u64 = rng.random_range(0..(1 << SnowflakeMastodonId::MACHINE_ID_BITS));
let sequence: u64 = rng.random_range(0..(1 << SnowflakeMastodonId::SEQUENCE_BITS));
SnowflakeMastodonId::from(timestamp, machine_id, sequence)
}
}
impl Dummy<FerroidMastodonId> for SnowflakeMastodonId {
fn dummy_with_rng<R: rand::Rng + ?Sized>(_: &FerroidMastodonId, rng: &mut R) -> Self {
let timestamp: u64 = rng.random_range(0..(1 << SnowflakeMastodonId::TIMESTAMP_BITS));
let machine_id: u64 = rng.random_range(0..(1 << SnowflakeMastodonId::MACHINE_ID_BITS));
let sequence: u64 = rng.random_range(0..(1 << SnowflakeMastodonId::SEQUENCE_BITS));
SnowflakeMastodonId::from(timestamp, machine_id, sequence)
}
}
impl Dummy<FerroidMastodonId> for String {
fn dummy_with_rng<R: rand::Rng + ?Sized>(config: &FerroidMastodonId, rng: &mut R) -> Self {
SnowflakeMastodonId::dummy_with_rng(config, rng)
.encode()
.to_string()
}
}

// --- SnowflakeInstagramId ---
impl Dummy<Faker> for SnowflakeInstagramId {
fn dummy_with_rng<R: rand::Rng + ?Sized>(_: &Faker, rng: &mut R) -> Self {
let timestamp: u64 = rng.random_range(0..(1 << SnowflakeInstagramId::TIMESTAMP_BITS));
let machine_id: u64 = rng.random_range(0..(1 << SnowflakeInstagramId::MACHINE_ID_BITS));
let sequence: u64 = rng.random_range(0..(1 << SnowflakeInstagramId::SEQUENCE_BITS));
SnowflakeInstagramId::from(timestamp, machine_id, sequence)
}
}
impl Dummy<FerroidInstagramId> for SnowflakeInstagramId {
fn dummy_with_rng<R: rand::Rng + ?Sized>(_: &FerroidInstagramId, rng: &mut R) -> Self {
let timestamp: u64 = rng.random_range(0..(1 << SnowflakeInstagramId::TIMESTAMP_BITS));
let machine_id: u64 = rng.random_range(0..(1 << SnowflakeInstagramId::MACHINE_ID_BITS));
let sequence: u64 = rng.random_range(0..(1 << SnowflakeInstagramId::SEQUENCE_BITS));
SnowflakeInstagramId::from(timestamp, machine_id, sequence)
}
}
impl Dummy<FerroidInstagramId> for String {
fn dummy_with_rng<R: rand::Rng + ?Sized>(config: &FerroidInstagramId, rng: &mut R) -> Self {
SnowflakeInstagramId::dummy_with_rng(config, rng)
.encode()
.to_string()
}
}
2 changes: 2 additions & 0 deletions fake/src/impls/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ pub mod color;
pub mod decimal;
#[cfg(feature = "email_address")]
pub mod email_address;
#[cfg(feature = "ferroid")]
pub mod ferroid;
#[cfg(feature = "geo-types")]
pub mod geo;
#[cfg(feature = "glam")]
Expand Down
5 changes: 5 additions & 0 deletions fake/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
//! - `rust-decimal`: [rust_decimal](https://docs.rs/rust_decimal) integration
//! - `time`: [time](https://docs.rs/time) integration
//! - `ulid`: [ulid](https://docs.rs/ulid) integration
//! - `ferroid`: [ferroid](https://docs.rs/ferroid) integration
//! - `uuid`: [uuid](https://docs.rs/uuid) integration
//!
//! # Usage
Expand Down Expand Up @@ -269,6 +270,10 @@ pub use impls::geo;
#[cfg_attr(docsrs, doc(cfg(feature = "ulid")))]
pub use impls::ulid;

#[cfg(feature = "ferroid")]
#[cfg_attr(docsrs, doc(cfg(feature = "ferroid")))]
pub use impls::ferroid;

#[cfg(feature = "uuid")]
#[cfg_attr(docsrs, doc(cfg(feature = "uuid")))]
pub use impls::uuid;
Expand Down
18 changes: 18 additions & 0 deletions fake/tests/determinism.rs
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,24 @@ mod ulid {
check_determinism! { one fake_ulid, ulid::Ulid, Faker }
}

// it's sufficient to check one language, because it doesn't change anything
#[cfg(feature = "ferroid")]
mod ferroid {
use fake::ferroid::*;
use fake::{Fake, Faker};
use rand::SeedableRng as _;
check_determinism! { one fake_ferroid_ulid_f, ferroid::ULID, Faker }
check_determinism! { one fake_ferroid_ulid, ferroid::ULID, FerroidULID }
check_determinism! { one fake_ferroid_snowflake_twitter_f, ferroid::SnowflakeTwitterId, Faker }
check_determinism! { one fake_ferroid_snowflake_twitter, ferroid::SnowflakeTwitterId, FerroidTwitterId }
check_determinism! { one fake_ferroid_snowflake_mastodon_f, ferroid::SnowflakeMastodonId, Faker }
check_determinism! { one fake_ferroid_snowflake_mastodon, ferroid::SnowflakeMastodonId, FerroidMastodonId }
check_determinism! { one fake_ferroid_snowflake_discord_f, ferroid::SnowflakeDiscordId, Faker }
check_determinism! { one fake_ferroid_snowflake_discord, ferroid::SnowflakeDiscordId, FerroidDiscordId }
check_determinism! { one fake_ferroid_snowflake_instagram_f, ferroid::SnowflakeInstagramId, Faker }
check_determinism! { one fake_ferroid_snowflake_instagram, ferroid::SnowflakeInstagramId, FerroidInstagramId }
}

// it's sufficient to check one language, because it doesn't change anything
#[cfg(feature = "uuid")]
mod uuid {
Expand Down
Loading