vespertide_core/
action.rs

1use crate::schema::{
2    ColumnDef, ColumnName, ColumnType, IndexDef, IndexName, TableConstraint, TableName,
3};
4use schemars::JsonSchema;
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
8#[serde(rename_all = "snake_case")]
9pub struct MigrationPlan {
10    pub comment: Option<String>,
11    #[serde(default)]
12    pub created_at: Option<String>,
13    pub version: u32,
14    pub actions: Vec<MigrationAction>,
15}
16
17#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
18#[serde(tag = "type")]
19pub enum MigrationAction {
20    #[serde(rename_all = "snake_case")]
21    CreateTable {
22        table: TableName,
23        columns: Vec<ColumnDef>,
24        constraints: Vec<TableConstraint>,
25    },
26    #[serde(rename_all = "snake_case")]
27    DeleteTable { table: TableName },
28    #[serde(rename_all = "snake_case")]
29    AddColumn {
30        table: TableName,
31        column: ColumnDef,
32        /// Optional fill value to backfill existing rows when adding NOT NULL without default.
33        fill_with: Option<String>,
34    },
35    #[serde(rename_all = "snake_case")]
36    RenameColumn {
37        table: TableName,
38        from: ColumnName,
39        to: ColumnName,
40    },
41    #[serde(rename_all = "snake_case")]
42    DeleteColumn {
43        table: TableName,
44        column: ColumnName,
45    },
46    #[serde(rename_all = "snake_case")]
47    ModifyColumnType {
48        table: TableName,
49        column: ColumnName,
50        new_type: ColumnType,
51    },
52    #[serde(rename_all = "snake_case")]
53    AddIndex { table: TableName, index: IndexDef },
54    #[serde(rename_all = "snake_case")]
55    RemoveIndex { table: TableName, name: IndexName },
56    #[serde(rename_all = "snake_case")]
57    AddConstraint {
58        table: TableName,
59        constraint: TableConstraint,
60    },
61    #[serde(rename_all = "snake_case")]
62    RemoveConstraint {
63        table: TableName,
64        constraint: TableConstraint,
65    },
66    #[serde(rename_all = "snake_case")]
67    RenameTable { from: TableName, to: TableName },
68    #[serde(rename_all = "snake_case")]
69    RawSql { sql: String },
70}