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)]
141 pub struct ResolvedRelation {
142 #[cfg_attr(feature = "serde", serde(default, skip_serializing_if = "Option::is_none"))]
143 pub name: Option<String>,
144 pub related_model: String,
145 pub relation_type: RelationType,
146 pub fields: Vec<String>,
147 pub references: Vec<String>,
148 pub on_delete: ReferentialAction,
149 pub on_update: ReferentialAction,
150 }
151}
152
153serde_derive! {
154 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
156 pub enum RelationType {
157 OneToOne,
158 OneToMany,
159 ManyToOne,
160 ManyToMany,
161 }
162}
163
164serde_derive! {
165 #[derive(Debug, Clone)]
167 pub struct PrimaryKey {
168 pub fields: Vec<String>,
169 }
170}
171
172impl PrimaryKey {
173 #[must_use]
175 pub fn is_composite(&self) -> bool {
176 self.fields.len() > 1
177 }
178}
179
180serde_derive! {
181 #[derive(Debug, Clone)]
186 pub struct Index {
187 pub fields: Vec<String>,
188 #[cfg_attr(feature = "serde", serde(default, skip_serializing_if = "Option::is_none"))]
189 pub name: Option<String>,
190 }
191}
192
193serde_derive! {
194 #[derive(Debug, Clone)]
199 pub struct UniqueConstraint {
200 pub fields: Vec<String>,
201 #[cfg_attr(feature = "serde", serde(default, skip_serializing_if = "Option::is_none"))]
202 pub name: Option<String>,
203 }
204}