Skip to content

About

A Rust proc macro to generate Rust code from Prisma schema files.

Resources

Contributing

Stars

3 stars

Watchers

2 watching

Forks

Latest commit

 

History

24 Commits

Folders and files

Repository files navigation

Prisma Rust Schema

Usage

Note

Currently, this package is not being updated on the crates.io registry, because this crate depends on a crate on GitHub.

  1. Install the library
cargo add --git https://github.com/ShaunSHamilton/prisma-rust-schema.git
  1. 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_paths = ["./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");

Options

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.

Example

/// 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>>,
}

Constraints

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

model User {
  id @db.ObjectId
}

pub struct User {
    id: String
}
6.x

model User {
  id @db.ObjectId
}

pub struct User {
    id: bson::oid::ObjectId
}

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.

About

A Rust proc macro to generate Rust code from Prisma schema files.

Resources

Contributing

Stars

3 stars

Watchers

2 watching

Forks

Used by

Contributors

Languages