Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/whizzes/pxid
An extended version of XID (Globally Unique Identifiers) which supports prefixes and is stored in 16 bytes
https://github.com/whizzes/pxid
graphql id pxid uid xid
Last synced: about 17 hours ago
JSON representation
An extended version of XID (Globally Unique Identifiers) which supports prefixes and is stored in 16 bytes
- Host: GitHub
- URL: https://github.com/whizzes/pxid
- Owner: whizzes
- License: mit
- Created: 2023-02-12T16:45:16.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2024-01-22T10:50:10.000Z (10 months ago)
- Last Synced: 2024-04-22T19:10:09.861Z (7 months ago)
- Topics: graphql, id, pxid, uid, xid
- Language: Rust
- Homepage: https://crates.io/crates/pxid
- Size: 80.1 KB
- Stars: 2
- Watchers: 1
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
Awesome Lists containing this project
README
pxid
Prefixed Globally Unique Identifier
[![Crates.io](https://img.shields.io/crates/v/pxid.svg)](https://crates.io/crates/pxid)
[![Documentation](https://docs.rs/pxid/badge.svg)](https://docs.rs/pxid)
![Build](https://github.com/EstebanBorai/pxid/workflows/build/badge.svg)
![Clippy](https://github.com/EstebanBorai/pxid/workflows/clippy/badge.svg)
![Formatter](https://github.com/EstebanBorai/pxid/workflows/fmt/badge.svg)## Motivation
Extend the [rs/xid][1] implementation by adding capability to have
a prefix and at the same time have a `u16` type support by fitting prefix bits.This library is inspired in Stripe IDs which have a friendly notation and are
very short IDs. These IDs are prefixed with a maximum of 4 bytes belonging to
the entity behind them.## Usage
```rust
use pxid::Pxid;fn main() -> Result<(), Box> {
// Given that some of the dependencies to build
// an instance of the Pxid may fail.
// - Getting current timestamp
// - Getting machine id
// - Getting process id
//
// A `Result` is returned.
let id = Pxid::new("acct".as_bytes())?;println!("{}", id); // acct_9m4e2mr0ui3e8a215n4g
}
```To improve memory usage (reduce allocations), and reuse dependencies required,
the `Factory` struct can also be used to build `Pxid` instances.This is the recommended way to build `Pxid` instances, given that resources are
initialized once, and then reused.```rust
use pxid::Factory;fn main() -> Result<(), Box> {
let factory = Factory::new_without_prefix()?;
let id = factory.with_prefix("acct");println!("{}", id); // acct_9m4e2mr0ui3e8a215n4g
let factory_with_prefix = Factory::new("acct")?;
let id = factory_with_prefix.generate();println!("{}", id); // acct_9m4e2mr0ui3e8a215n4g
}
```### GraphQL Support
You can use `Pxid` on GraphQL via the `async-graphql` crate.
Make sure the `graphql` feature is enabled and import `Pxid` for GraphQL.```rust
use async_graphql::{Context, InputObject, Result, SimpleObject};
use pxid::graphql::Pxid;// -- snip --
#[derive(Debug, InputObject)]
pub struct PostCreateInput {
pub title: String,
pub content: String,
pub parent_id: Option,
}impl PostCreate {
pub async fn exec(ctx: &Context<'_>, input: PostCreateInput) -> Result {
// -- snip --
```> Check out the full example [here][2].
## Layout
A prefixed XID fits nicely on a 16 bytes slice thanks to its packed data format.
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Prefix
Timestamp
Machine ID
Process ID
Counter
For a total of 16 bytes.
The prefix allows up to 4 UTF-8 Characters, this allows the ID to provide some
context about its scope.```txt
acct_9m4e2mr0ui3e8a215n4g
ordr_9m4e2mr0ui3e8a215n4g
usr_9m4e2mr0ui3e8a215n4g
```This way IDs are not only even harder to collide, but they also provides a bit
of context on record association.## License
This project is licensed under the MIT License
[1]: https://github.com/rs/xid
[2]: https://github.com/whizzes/gabble/blob/ca10e295ce1386dd15a8f91f968e7aa8085287c4/crates/server/src/graphql/modules/post/mutation/post_create.rs