Skip to content

ShaunSHamilton/prisma-rust-schema

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_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");

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

License

Contributing

Stars

Watchers

Forks

Languages