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