Note
Currently, this package is not being updated on the crates.io registry, because this crate depends on a crate on GitHub.
- Install the library
cargo add --git https://github.com/ShaunSHamilton/prisma-rust-schema.git
- Use the proc-macro:
use prisma_rust_schema::import_types;
// Relative to `Cargo.toml`
import_types!("./prisma/schema.prisma");
// Or, use import options:
import_types!(
schema_path = "./prisma/schema.prisma",
derive = [Debug, Clone, serde::Deserialize, serde::Serialize], // Optional, defaults to no derive
include = ["User", "Post"], // Optional, defaults to all models
prefix = "MyPrefix", // Optional, defaults to no prefix
patch = [
struct MyPrefixUser {
existing_field: MyPrefixPost
}
]
);
// If `schema_path` implements `IntoUrl`, it is fetched.
import_types!("https://raw.githubusercontent.com/ShaunSHamilton/prisma-rust-schema/refs/heads/master/prisma/schema.prisma");
Option | Example | Description |
---|---|---|
@prs.rename = <new_name> |
@prs.rename = username |
Rename the field in the generated Rust struct. |
@prs.skip |
@prs.skip |
Skip the field in the generated Rust struct. |
@prs.type = <type_override> |
@prs.type = usize |
Override the type of the field in the generated Rust struct. |
@prs.visibility = <visibility> |
@prs.visibility = public |
Override the visibility (public, private, protected) of the field in the generated Rust struct. |
@prs.derive = <trait> |
@prs.derive = Debug,Clone,serde::Deserialize |
Fully-qualified, comma-separated derive attributes for the generated Rust struct. |
/// User model documentation
/// @prs.visibility = protected
/// @prs.derive = Debug,Clone,serde::Deserialize,serde::Serialize
model User {
/// User ID
/// @prs.rename = `user_id`
/// @prs.type = `usize`
id Int @id @default(autoincrement())
/// User name
/// @prs.skip
name String?
/// User emails
emails String[]
/// User age
age Int? @default(0)
}
/// Post model with only defaults
/// @prs.derive = Debug,Clone,serde::Deserialize,serde::Serialize
model post {
id Int @id @default(autoincrement())
title String
content Json
published Boolean @default(false)
publishedAt DateTime? @default(now())
}
Becomes:
#[doc = "User model documentation"]
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
pub(crate) struct User {
#[doc = "User ID"]
#[serde(rename = "user")]
pub(crate) user_id: usize,
#[doc = "User emails"]
pub(crate) emails: Vec<String>,
/// User age
pub(crate) age: Option<i32>,
}
#[doc = "Post model with only defaults"]
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
pub struct Post {
pub id: i32,
pub title: String,
pub content: serde_json::Value,
pub published: bool,
pub published_at: Option<chrono::DateTime<chrono::Utc>>,
}
This package is tested to work with prisma@^6
. It does work with prisma@^5
but there are no native types such as @db.ObjectId
. So, @prs.type
must be used, otherwise the type will be the .prisma
type.
Version | Prisma Schema | Rust Type |
---|---|---|
5.x |
|
|
6.x |
|
|
Currently, it is up to the user to ensure all types have valid derive attributes. Specifically, if the rename
attribute is needed, then serde::Deserialize
and serde::Serialize
must be used. The generator will not add them automatically.