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 = 1;
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}
47
48#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
49#[serde(rename_all = "snake_case")]
50pub enum TableKind {
51    Table,
52    View,
53    MaterializedView,
54}
55
56#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
57#[serde(deny_unknown_fields)]
58pub struct Column {
59    pub name: String,
60    pub ty: PgType,
61    pub nullable: bool,
62    pub has_default: bool,
63    pub generated: bool,
64    pub identity: Identity,
65}
66
67#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
68#[serde(rename_all = "snake_case")]
69pub enum Identity {
70    None,
71    Always,
72    ByDefault,
73}
74
75#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
76#[serde(
77    tag = "kind",
78    content = "value",
79    rename_all = "snake_case",
80    deny_unknown_fields
81)]
82pub enum PgType {
83    Builtin(String),
84    Named {
85        schema: String,
86        name: String,
87    },
88    Array(Box<PgType>),
89    Domain {
90        schema: String,
91        name: String,
92        base: Box<PgType>,
93    },
94}
95
96#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
97#[serde(deny_unknown_fields)]
98pub struct Function {
99    pub name: String,
100    pub arguments: Vec<Argument>,
101    pub returns: ReturnType,
102    pub returns_set: bool,
103}
104
105#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
106#[serde(deny_unknown_fields)]
107pub struct Argument {
108    pub name: String,
109    pub ty: PgType,
110    pub has_default: bool,
111}
112
113#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
114#[serde(
115    tag = "kind",
116    content = "value",
117    rename_all = "snake_case",
118    deny_unknown_fields
119)]
120pub enum ReturnType {
121    Type(PgType),
122    Record(Vec<Column>),
123}