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", rename_all = "snake_case")]
19pub enum MigrationAction {
20    CreateTable {
21        table: TableName,
22        columns: Vec<ColumnDef>,
23        constraints: Vec<TableConstraint>,
24    },
25    DeleteTable {
26        table: TableName,
27    },
28    AddColumn {
29        table: TableName,
30        column: ColumnDef,
31        /// Optional fill value to backfill existing rows when adding NOT NULL without default.
32        fill_with: Option<String>,
33    },
34    RenameColumn {
35        table: TableName,
36        from: ColumnName,
37        to: ColumnName,
38    },
39    DeleteColumn {
40        table: TableName,
41        column: ColumnName,
42    },
43    ModifyColumnType {
44        table: TableName,
45        column: ColumnName,
46        new_type: ColumnType,
47    },
48    AddIndex {
49        table: TableName,
50        index: IndexDef,
51    },
52    RemoveIndex {
53        table: TableName,
54        name: IndexName,
55    },
56    AddConstraint {
57        table: TableName,
58        constraint: TableConstraint,
59    },
60    RemoveConstraint {
61        table: TableName,
62        constraint: TableConstraint,
63    },
64    RenameTable {
65        from: TableName,
66        to: TableName,
67    },
68    RawSql {
69        sql: String,
70    },
71}