Skip to content

Commit a15b084

Browse files
committed
Split file
1 parent 142c02c commit a15b084

23 files changed

Lines changed: 1526 additions & 1391 deletions

File tree

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
use std::path::{Path, PathBuf};
2+
3+
use serde::{Deserialize, Serialize};
4+
5+
use crate::file_format::FileFormat;
6+
use crate::name_case::NameCase;
7+
8+
/// Default migration filename pattern: zero-padded version + sanitized comment.
9+
pub fn default_migration_filename_pattern() -> String {
10+
"%04v_%m".to_string()
11+
}
12+
13+
/// Top-level vespertide configuration.
14+
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
15+
#[serde(rename_all = "camelCase")]
16+
pub struct VespertideConfig {
17+
pub models_dir: PathBuf,
18+
pub migrations_dir: PathBuf,
19+
pub table_naming_case: NameCase,
20+
pub column_naming_case: NameCase,
21+
#[serde(default)]
22+
pub model_format: FileFormat,
23+
#[serde(default)]
24+
pub migration_format: FileFormat,
25+
#[serde(default = "default_migration_filename_pattern")]
26+
pub migration_filename_pattern: String,
27+
}
28+
29+
impl Default for VespertideConfig {
30+
fn default() -> Self {
31+
Self {
32+
models_dir: PathBuf::from("models"),
33+
migrations_dir: PathBuf::from("migrations"),
34+
table_naming_case: NameCase::Snake,
35+
column_naming_case: NameCase::Snake,
36+
model_format: FileFormat::Json,
37+
migration_format: FileFormat::Json,
38+
migration_filename_pattern: default_migration_filename_pattern(),
39+
}
40+
}
41+
}
42+
43+
impl VespertideConfig {
44+
pub fn new() -> Self {
45+
Self::default()
46+
}
47+
48+
/// Path where model definitions are stored.
49+
pub fn models_dir(&self) -> &Path {
50+
&self.models_dir
51+
}
52+
53+
/// Path where migrations are stored.
54+
pub fn migrations_dir(&self) -> &Path {
55+
&self.migrations_dir
56+
}
57+
58+
/// Naming case for table names (flattened).
59+
pub fn table_case(&self) -> NameCase {
60+
self.table_naming_case
61+
}
62+
63+
/// Naming case for column names (flattened).
64+
pub fn column_case(&self) -> NameCase {
65+
self.column_naming_case
66+
}
67+
68+
/// Preferred file format for models.
69+
pub fn model_format(&self) -> FileFormat {
70+
self.model_format
71+
}
72+
73+
/// Preferred file format for migrations.
74+
pub fn migration_format(&self) -> FileFormat {
75+
self.migration_format
76+
}
77+
78+
/// Pattern for migration filenames (supports %v and %m placeholders).
79+
pub fn migration_filename_pattern(&self) -> &str {
80+
&self.migration_filename_pattern
81+
}
82+
}
83+
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
use clap::ValueEnum;
2+
use serde::{Deserialize, Serialize};
3+
4+
/// Supported file formats for generated artifacts.
5+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ValueEnum)]
6+
#[serde(rename_all = "lowercase")]
7+
pub enum FileFormat {
8+
Json,
9+
Yaml,
10+
Yml,
11+
}
12+
13+
impl Default for FileFormat {
14+
fn default() -> Self {
15+
FileFormat::Json
16+
}
17+
}
18+

crates/vespertide-config/src/lib.rs

Lines changed: 8 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -1,127 +1,15 @@
1-
use std::path::{Path, PathBuf};
1+
pub mod config;
2+
pub mod file_format;
3+
pub mod name_case;
24

3-
use serde::{Deserialize, Serialize};
4-
use clap::ValueEnum;
5-
6-
/// Supported naming cases.
7-
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
8-
#[serde(rename_all = "snake_case")]
9-
pub enum NameCase {
10-
Snake,
11-
Camel,
12-
Pascal,
13-
}
14-
15-
impl NameCase {
16-
/// Returns true when snake case.
17-
pub fn is_snake(self) -> bool {
18-
matches!(self, NameCase::Snake)
19-
}
20-
21-
/// Returns true when camel case.
22-
pub fn is_camel(self) -> bool {
23-
matches!(self, NameCase::Camel)
24-
}
25-
26-
/// Returns true when pascal case.
27-
pub fn is_pascal(self) -> bool {
28-
matches!(self, NameCase::Pascal)
29-
}
30-
}
31-
32-
/// Supported file formats for generated artifacts.
33-
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ValueEnum)]
34-
#[serde(rename_all = "lowercase")]
35-
pub enum FileFormat {
36-
Json,
37-
Yaml,
38-
Yml,
39-
}
40-
41-
impl Default for FileFormat {
42-
fn default() -> Self {
43-
FileFormat::Json
44-
}
45-
}
46-
47-
/// Default migration filename pattern: zero-padded version + sanitized comment.
48-
pub fn default_migration_filename_pattern() -> String {
49-
"%04v_%m".to_string()
50-
}
51-
52-
/// Top-level vespertide configuration.
53-
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
54-
#[serde(rename_all = "camelCase")]
55-
pub struct VespertideConfig {
56-
pub models_dir: PathBuf,
57-
pub migrations_dir: PathBuf,
58-
pub table_naming_case: NameCase,
59-
pub column_naming_case: NameCase,
60-
#[serde(default)]
61-
pub model_format: FileFormat,
62-
#[serde(default)]
63-
pub migration_format: FileFormat,
64-
#[serde(default = "default_migration_filename_pattern")]
65-
pub migration_filename_pattern: String,
66-
}
67-
68-
impl Default for VespertideConfig {
69-
fn default() -> Self {
70-
Self {
71-
models_dir: PathBuf::from("models"),
72-
migrations_dir: PathBuf::from("migrations"),
73-
table_naming_case: NameCase::Snake,
74-
column_naming_case: NameCase::Snake,
75-
model_format: FileFormat::Json,
76-
migration_format: FileFormat::Json,
77-
migration_filename_pattern: default_migration_filename_pattern(),
78-
}
79-
}
80-
}
81-
82-
impl VespertideConfig {
83-
pub fn new() -> Self {
84-
Self::default()
85-
}
86-
87-
/// Path where model definitions are stored.
88-
pub fn models_dir(&self) -> &Path {
89-
&self.models_dir
90-
}
91-
92-
/// Path where migrations are stored.
93-
pub fn migrations_dir(&self) -> &Path {
94-
&self.migrations_dir
95-
}
96-
97-
/// Naming case for table names (flattened).
98-
pub fn table_case(&self) -> NameCase {
99-
self.table_naming_case
100-
}
101-
102-
/// Naming case for column names (flattened).
103-
pub fn column_case(&self) -> NameCase {
104-
self.column_naming_case
105-
}
106-
107-
/// Preferred file format for models.
108-
pub fn model_format(&self) -> FileFormat {
109-
self.model_format
110-
}
111-
112-
/// Preferred file format for migrations.
113-
pub fn migration_format(&self) -> FileFormat {
114-
self.migration_format
115-
}
116-
117-
/// Pattern for migration filenames (supports %v and %m placeholders).
118-
pub fn migration_filename_pattern(&self) -> &str {
119-
&self.migration_filename_pattern
120-
}
121-
}
5+
pub use config::{default_migration_filename_pattern, VespertideConfig};
6+
pub use file_format::FileFormat;
7+
pub use name_case::NameCase;
1228

1239
#[cfg(test)]
12410
mod tests {
11+
use std::path::{Path, PathBuf};
12+
12513
use super::*;
12614

12715
#[test]
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
use serde::{Deserialize, Serialize};
2+
3+
/// Supported naming cases.
4+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
5+
#[serde(rename_all = "snake_case")]
6+
pub enum NameCase {
7+
Snake,
8+
Camel,
9+
Pascal,
10+
}
11+
12+
impl NameCase {
13+
/// Returns true when snake case.
14+
pub fn is_snake(self) -> bool {
15+
matches!(self, NameCase::Snake)
16+
}
17+
18+
/// Returns true when camel case.
19+
pub fn is_camel(self) -> bool {
20+
matches!(self, NameCase::Camel)
21+
}
22+
23+
/// Returns true when pascal case.
24+
pub fn is_pascal(self) -> bool {
25+
matches!(self, NameCase::Pascal)
26+
}
27+
}
28+

crates/vespertide-core/src/action.rs

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize};
55
use schemars::JsonSchema;
66

77
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
8-
#[serde(rename_all = "camelCase")]
8+
#[serde(rename_all = "snake_case")]
99
pub struct MigrationPlan {
1010
pub comment: Option<String>,
1111
#[serde(default)]
@@ -17,43 +17,42 @@ pub struct MigrationPlan {
1717
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
1818
#[serde(tag = "type")]
1919
pub enum MigrationAction {
20-
#[serde(rename_all = "camelCase")]
20+
#[serde(rename_all = "snake_case")]
2121
CreateTable {
2222
table: TableName,
2323
columns: Vec<ColumnDef>,
2424
constraints: Vec<TableConstraint>,
2525
},
26-
#[serde(rename_all = "camelCase")]
26+
#[serde(rename_all = "snake_case")]
2727
DeleteTable { table: TableName },
28-
#[serde(rename_all = "camelCase")]
28+
#[serde(rename_all = "snake_case")]
2929
AddColumn {
3030
table: TableName,
3131
column: ColumnDef,
3232
/// Optional fill value to backfill existing rows when adding NOT NULL without default.
3333
fill_with: Option<String>,
3434
},
35-
#[serde(rename_all = "camelCase")]
35+
#[serde(rename_all = "snake_case")]
3636
RenameColumn {
3737
table: TableName,
3838
from: ColumnName,
3939
to: ColumnName,
4040
},
41-
#[serde(rename_all = "camelCase")]
41+
#[serde(rename_all = "snake_case")]
4242
DeleteColumn {
4343
table: TableName,
4444
column: ColumnName,
4545
},
46-
#[serde(rename_all = "camelCase")]
46+
#[serde(rename_all = "snake_case")]
4747
ModifyColumnType {
4848
table: TableName,
4949
column: ColumnName,
50-
#[serde(rename = "newType")]
5150
new_type: ColumnType,
5251
},
53-
#[serde(rename_all = "camelCase")]
52+
#[serde(rename_all = "snake_case")]
5453
AddIndex { table: TableName, index: IndexDef },
55-
#[serde(rename_all = "camelCase")]
54+
#[serde(rename_all = "snake_case")]
5655
RemoveIndex { table: TableName, name: IndexName },
57-
#[serde(rename_all = "camelCase")]
56+
#[serde(rename_all = "snake_case")]
5857
RenameTable { from: TableName, to: TableName },
5958
}

crates/vespertide-core/src/schema/column.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize};
44
use crate::schema::names::ColumnName;
55

66
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
7-
#[serde(rename_all = "camelCase")]
7+
#[serde(rename_all = "snake_case")]
88
pub struct ColumnDef {
99
pub name: ColumnName,
1010
pub r#type: ColumnType,

crates/vespertide-core/src/schema/constraint.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use serde::{Deserialize, Serialize};
44
use crate::schema::{ReferenceAction, names::ColumnName, names::TableName};
55

66
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
7+
#[serde(rename_all = "snake_case", tag = "type")]
78
pub enum TableConstraint {
89
PrimaryKey(Vec<ColumnName>),
910
Unique {
@@ -13,13 +14,9 @@ pub enum TableConstraint {
1314
ForeignKey {
1415
name: Option<String>,
1516
columns: Vec<ColumnName>,
16-
#[serde(rename = "refTable")]
1717
ref_table: TableName,
18-
#[serde(rename = "refColumns")]
1918
ref_columns: Vec<ColumnName>,
20-
#[serde(rename = "onDelete")]
2119
on_delete: Option<ReferenceAction>,
22-
#[serde(rename = "onUpdate")]
2320
on_update: Option<ReferenceAction>,
2421
},
2522
Check {

crates/vespertide-core/src/schema/index.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use schemars::JsonSchema;
44
use crate::schema::names::{ColumnName, IndexName};
55

66
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
7-
#[serde(rename_all = "camelCase")]
7+
#[serde(rename_all = "snake_case")]
88
pub struct IndexDef {
99
pub name: IndexName,
1010
pub columns: Vec<ColumnName>,

crates/vespertide-core/src/schema/table.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::schema::{
66
};
77

88
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
9-
#[serde(rename_all = "camelCase")]
9+
#[serde(rename_all = "snake_case")]
1010
pub struct TableDef {
1111
pub name: TableName,
1212
pub columns: Vec<ColumnDef>,

0 commit comments

Comments
 (0)