1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3
4#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
7pub struct TableIdentity {
8 pub schema: Option<String>,
9 pub name: String,
10}
11
12impl TableIdentity {
13 pub fn canonical_key(&self, default_schema: &str) -> String {
14 let schema_name = self.schema.as_deref().unwrap_or(default_schema);
15 format!("{}.{}", schema_name, self.name)
16 }
17}
18
19#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
20pub struct IndexIdentity {
21 pub schema: Option<String>,
22 pub name: String,
23}
24
25impl IndexIdentity {
26 pub fn canonical_key(&self, default_schema: &str) -> String {
27 let schema_name = self.schema.as_deref().unwrap_or(default_schema);
28 format!("{}.{}", schema_name, self.name)
29 }
30}
31
32#[non_exhaustive]
33#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
34pub enum AlterAction {
35 AddColumn,
36 DropColumn,
37 AlterColumnUnspecified,
38 Other,
39}
40
41#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
42pub enum MigrationOp {
43 CreateTable(TableIdentity),
44 DropTable(TableIdentity),
45 CreateIndex {
46 index_name: Option<String>,
47 table: TableIdentity,
48 concurrently: bool,
49 },
50 DropIndex {
51 indexes: Vec<IndexIdentity>,
52 concurrently: bool,
53 },
54 AlterTable {
55 table: TableIdentity,
56 actions: Vec<AlterAction>,
57 },
58 Ignored(String),
59 Unknown {
60 raw: String,
61 reason: String,
62 },
63}
64
65#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
66pub struct SpannedOp {
67 pub op: MigrationOp,
68 pub start: u32,
69 pub end: u32,
70}
71
72#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
73pub enum LockTier {
74 Tier1,
75 Tier2,
76 Tier3,
77}
78
79#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
80pub struct CacheEntry {
81 pub estimated_rows: u64,
82 pub relpages: Option<u64>,
83}
84
85#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
86pub struct CacheData {
87 pub last_updated: u64,
88 pub tables: HashMap<String, CacheEntry>,
89 pub indexes: HashMap<String, String>,
90}
91
92#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
94pub struct LintRecord {
95 pub file: String,
96 pub start: u32,
97 pub end: u32,
98 pub tier: LockTier,
99 pub op: MigrationOp,
100 pub message: String,
101 pub rule_name: String,
102 pub recipe: String,
103}