1use crate::ast::{DefaultValue, ReferentialAction};
18use crate::types::{DatabaseProvider, ScalarType};
19
20macro_rules! serde_derive {
21 ($(#[$meta:meta])* $vis:vis struct $name:ident { $($body:tt)* }) => {
22 $(#[$meta])*
23 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24 $vis struct $name { $($body)* }
25 };
26 ($(#[$meta:meta])* $vis:vis enum $name:ident { $($body:tt)* }) => {
27 $(#[$meta])*
28 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
29 $vis enum $name { $($body)* }
30 };
31}
32
33serde_derive! {
34 #[derive(Debug, Clone)]
36 pub struct Schema {
37 pub datasource: DatasourceConfig,
38 pub generators: Vec<GeneratorConfig>,
39 pub enums: Vec<Enum>,
40 pub models: Vec<Model>,
41 }
42}
43
44serde_derive! {
45 #[derive(Debug, Clone)]
47 pub struct DatasourceConfig {
48 pub name: String,
49 pub provider: DatabaseProvider,
50 pub url: String,
51 }
52}
53
54serde_derive! {
55 #[derive(Debug, Clone)]
57 pub struct GeneratorConfig {
58 pub name: String,
59 pub output: String,
60 }
61}
62
63serde_derive! {
64 #[derive(Debug, Clone)]
66 pub struct Enum {
67 pub name: String,
68 pub db_name: String,
69 pub variants: Vec<String>,
70 }
71}
72
73serde_derive! {
74 #[derive(Debug, Clone)]
76 pub struct Model {
77 pub name: String,
78 pub db_name: String,
79 pub fields: Vec<Field>,
80 pub primary_key: PrimaryKey,
81 pub indexes: Vec<Index>,
82 pub unique_constraints: Vec<UniqueConstraint>,
83 }
84}
85
86serde_derive! {
87 #[derive(Debug, Clone)]
89 pub struct Field {
90 pub name: String,
91 pub db_name: String,
92 pub field_type: FieldKind,
93 pub is_optional: bool,
94 pub is_list: bool,
95 pub is_id: bool,
96 pub is_unique: bool,
97 pub is_updated_at: bool,
98 pub default: Option<DefaultValue>,
99 pub relation: Option<ResolvedRelation>,
100 pub db_type: Option<(String, Vec<String>)>,
103 }
104}
105
106impl Field {
107 #[must_use]
109 pub fn is_scalar(&self) -> bool {
110 !matches!(self.field_type, FieldKind::Model(_)) && !self.is_list
111 }
112
113 #[must_use]
115 pub fn has_default(&self) -> bool {
116 self.default.is_some() || self.is_updated_at
117 }
118}
119
120serde_derive! {
121 #[derive(Debug, Clone, PartialEq, Eq)]
123 pub enum FieldKind {
124 Scalar(ScalarType),
126 Enum(String),
128 Model(String),
130 }
131}
132
133serde_derive! {
134 #[derive(Debug, Clone)]
136 pub struct ResolvedRelation {
137 pub related_model: String,
138 pub relation_type: RelationType,
139 pub fields: Vec<String>,
140 pub references: Vec<String>,
141 pub on_delete: ReferentialAction,
142 pub on_update: ReferentialAction,
143 }
144}
145
146serde_derive! {
147 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
149 pub enum RelationType {
150 OneToOne,
151 OneToMany,
152 ManyToOne,
153 ManyToMany,
154 }
155}
156
157serde_derive! {
158 #[derive(Debug, Clone)]
160 pub struct PrimaryKey {
161 pub fields: Vec<String>,
162 }
163}
164
165impl PrimaryKey {
166 #[must_use]
168 pub fn is_composite(&self) -> bool {
169 self.fields.len() > 1
170 }
171}
172
173serde_derive! {
174 #[derive(Debug, Clone)]
176 pub struct Index {
177 pub fields: Vec<String>,
178 }
179}
180
181serde_derive! {
182 #[derive(Debug, Clone)]
184 pub struct UniqueConstraint {
185 pub fields: Vec<String>,
186 }
187}