Skip to main content

rp_supabase_codegen/
model.rs

1//! Versioned, portable `PostgreSQL` schema metadata. Snapshots contain no credentials or row data.
2
3use serde::{Deserialize, Serialize};
4
5/// Current on-disk snapshot format.
6pub const SNAPSHOT_VERSION: u32 = 2;
7
8/// Metadata that can be checked into source control for offline builds.
9#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
10#[serde(deny_unknown_fields)]
11pub struct Snapshot {
12    pub version: u32,
13    pub schemas: Vec<Schema>,
14}
15
16#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
17#[serde(deny_unknown_fields)]
18pub struct Schema {
19    pub name: String,
20    pub enums: Vec<Enum>,
21    pub composites: Vec<Composite>,
22    pub tables: Vec<Table>,
23    pub functions: Vec<Function>,
24}
25
26#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
27#[serde(deny_unknown_fields)]
28pub struct Enum {
29    pub name: String,
30    pub variants: Vec<String>,
31}
32
33#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
34#[serde(deny_unknown_fields)]
35pub struct Composite {
36    pub name: String,
37    pub fields: Vec<Column>,
38}
39
40#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
41#[serde(deny_unknown_fields)]
42pub struct Table {
43    pub name: String,
44    pub kind: TableKind,
45    pub columns: Vec<Column>,
46    #[serde(deserialize_with = "Deserialize::deserialize")]
47    pub primary_key: Option<Vec<String>>,
48    pub unique_keys: Vec<Vec<String>>,
49    pub foreign_keys: Vec<ForeignKey>,
50    pub is_partition: bool,
51}
52
53/// Qualified relation identity, including targets outside the selected schemas.
54#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
55#[serde(deny_unknown_fields)]
56pub struct RelationRef {
57    pub schema: String,
58    pub name: String,
59}
60
61/// A direct catalog foreign key, with both column lists in matching constraint order.
62#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
63#[serde(deny_unknown_fields)]
64pub struct ForeignKey {
65    pub name: String,
66    pub columns: Vec<String>,
67    pub referenced_relation: RelationRef,
68    pub referenced_columns: Vec<String>,
69}
70
71#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
72#[serde(rename_all = "snake_case")]
73pub enum TableKind {
74    Table,
75    View,
76    MaterializedView,
77}
78
79#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
80#[serde(deny_unknown_fields)]
81pub struct Column {
82    pub name: String,
83    pub ty: PgType,
84    pub nullable: bool,
85    pub has_default: bool,
86    pub generated: bool,
87    pub identity: Identity,
88}
89
90#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
91#[serde(rename_all = "snake_case")]
92pub enum Identity {
93    None,
94    Always,
95    ByDefault,
96}
97
98#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
99#[serde(
100    tag = "kind",
101    content = "value",
102    rename_all = "snake_case",
103    deny_unknown_fields
104)]
105pub enum PgType {
106    Builtin(String),
107    Named {
108        schema: String,
109        name: String,
110    },
111    Array(Box<Self>),
112    Domain {
113        schema: String,
114        name: String,
115        base: Box<Self>,
116    },
117}
118
119#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
120#[serde(deny_unknown_fields)]
121pub struct Function {
122    pub name: String,
123    pub arguments: Vec<Argument>,
124    pub returns: ReturnType,
125    pub returns_set: bool,
126}
127
128#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
129#[serde(deny_unknown_fields)]
130pub struct Argument {
131    pub name: String,
132    pub ty: PgType,
133    pub has_default: bool,
134}
135
136#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
137#[serde(
138    tag = "kind",
139    content = "value",
140    rename_all = "snake_case",
141    deny_unknown_fields
142)]
143pub enum ReturnType {
144    Type(PgType),
145    Record(Vec<Column>),
146}