Crates.io Documentation Codecov Dependency status

surreal-id

The surreal-id crate offers a standardized way to create and validate IDs in your application for usage with SurrealDB. Using the NewId trait, the crate streamlines the ID type defining process with a blanket implementation of new that handles errors like malformed or empty IDs, and ensures consistency with associated table names and functionality with SurrealDB. This also enables developers to create custom IDs in their application layer and serialize and deserialize those types safely from SurrealDB, ensuring type safety and consistency throughout the app.

Example

```rust use serde::{Deserialize, Serialize}; use surreal_id::NewId; use surrealdb::{opt::RecordId, sql::Id};

pub const USERS_TABLE: &str = "users";

[derive(Serialize, Deserialize)]

pub struct UserId(RecordId);

impl NewId for UserId { const TABLE: &'static str = USERS_TABLE;

fn from_inner_id<T: Into<Id>>(inner_id: T) -> Self {
    UserId(RecordId {
        tb: Self::TABLE.to_string(),
        id: inner_id.into(),
    })
}

} ```

NOTE: For most use cases, most of the above code is boilerplate that could be eliminated with a procerdural macro, where the only thing specified is the table name. PRs welcome!

Now you can instantiate the UserId type using new, and use it in your struct with SurrealDB like so:

```rust

[derive(Serialize, Deserialize)]

pub struct User { id: UserId, name: String, }

// The new function is automatically created for us by the blanket implementation from the NewId trait let typesafecustomid = UserId::new("fa77edc3-56ed-4208-9e0b-c0b1c32e2d34")?,

let usertobecreated = User { id: typesafecustomid, name: "John Doe".tostring(), };

let db = Surreal::new::(()).await?; db.usens("test").usedb("test").await?;

let createresult = db.create(USERSTABLE).content(&usertobecreated).await; let retrieveduser: User = create_result.unwrap().remove(0);

asserteq!(usertobecreated, retrieved_user) ```

License

Licensed under either of

at your option.

Contribution

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.