1use serde::{Deserialize, Serialize};
4
5pub const SNAPSHOT_VERSION: u32 = 2;
7
8#[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#[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#[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}