From d2b72e3cb5a289daa33bb469c29789d15ab238f5 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Wed, 7 Jan 2026 02:51:46 +0900 Subject: [PATCH] Fix keyword issue --- .../changepack_log_HH-eTMv3QIWWbQ6ECBCQT.json | 1 + Cargo.lock | 20 ++++++------ crates/vespertide-exporter/src/seaorm/mod.rs | 32 +++++++++++++++++++ 3 files changed, 43 insertions(+), 10 deletions(-) create mode 100644 .changepacks/changepack_log_HH-eTMv3QIWWbQ6ECBCQT.json diff --git a/.changepacks/changepack_log_HH-eTMv3QIWWbQ6ECBCQT.json b/.changepacks/changepack_log_HH-eTMv3QIWWbQ6ECBCQT.json new file mode 100644 index 0000000..f05f0db --- /dev/null +++ b/.changepacks/changepack_log_HH-eTMv3QIWWbQ6ECBCQT.json @@ -0,0 +1 @@ +{"changes":{"crates/vespertide-naming/Cargo.toml":"Patch","crates/vespertide-planner/Cargo.toml":"Patch","crates/vespertide-macro/Cargo.toml":"Patch","crates/vespertide-core/Cargo.toml":"Patch","crates/vespertide/Cargo.toml":"Patch","crates/vespertide-cli/Cargo.toml":"Patch","crates/vespertide-loader/Cargo.toml":"Patch","crates/vespertide-exporter/Cargo.toml":"Patch","crates/vespertide-query/Cargo.toml":"Patch","crates/vespertide-config/Cargo.toml":"Patch"},"note":"Fix keyword issue","date":"2026-01-06T17:51:25.259877600Z"} \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 9177379..12378fd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2995,7 +2995,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "vespertide" -version = "0.1.22" +version = "0.1.23" dependencies = [ "vespertide-core", "vespertide-macro", @@ -3003,7 +3003,7 @@ dependencies = [ [[package]] name = "vespertide-cli" -version = "0.1.22" +version = "0.1.23" dependencies = [ "anyhow", "assert_cmd", @@ -3028,7 +3028,7 @@ dependencies = [ [[package]] name = "vespertide-config" -version = "0.1.22" +version = "0.1.23" dependencies = [ "clap", "schemars", @@ -3038,7 +3038,7 @@ dependencies = [ [[package]] name = "vespertide-core" -version = "0.1.22" +version = "0.1.23" dependencies = [ "rstest", "schemars", @@ -3049,7 +3049,7 @@ dependencies = [ [[package]] name = "vespertide-exporter" -version = "0.1.22" +version = "0.1.23" dependencies = [ "insta", "rstest", @@ -3060,7 +3060,7 @@ dependencies = [ [[package]] name = "vespertide-loader" -version = "0.1.22" +version = "0.1.23" dependencies = [ "anyhow", "rstest", @@ -3075,7 +3075,7 @@ dependencies = [ [[package]] name = "vespertide-macro" -version = "0.1.22" +version = "0.1.23" dependencies = [ "proc-macro2", "quote", @@ -3092,11 +3092,11 @@ dependencies = [ [[package]] name = "vespertide-naming" -version = "0.1.22" +version = "0.1.23" [[package]] name = "vespertide-planner" -version = "0.1.22" +version = "0.1.23" dependencies = [ "insta", "rstest", @@ -3107,7 +3107,7 @@ dependencies = [ [[package]] name = "vespertide-query" -version = "0.1.22" +version = "0.1.23" dependencies = [ "insta", "rstest", diff --git a/crates/vespertide-exporter/src/seaorm/mod.rs b/crates/vespertide-exporter/src/seaorm/mod.rs index 8f6a4b9..ad80335 100644 --- a/crates/vespertide-exporter/src/seaorm/mod.rs +++ b/crates/vespertide-exporter/src/seaorm/mod.rs @@ -793,6 +793,18 @@ fn render_indexes(lines: &mut Vec, constraints: &[TableConstraint]) { } } +/// Rust reserved keywords that cannot be used as identifiers without raw identifier syntax. +/// Reference: https://doc.rust-lang.org/reference/keywords.html +const RUST_KEYWORDS: &[&str] = &[ + // Strict keywords + "as", "async", "await", "break", "const", "continue", "crate", "dyn", "else", "enum", "extern", + "false", "fn", "for", "if", "impl", "in", "let", "loop", "match", "mod", "move", "mut", "pub", + "ref", "return", "self", "Self", "static", "struct", "super", "trait", "true", "type", + "unsafe", "use", "where", "while", // Reserved keywords (for future use) + "abstract", "become", "box", "do", "final", "macro", "override", "priv", "try", "typeof", + "unsized", "virtual", "yield", +]; + fn sanitize_field_name(name: &str) -> String { let mut result = String::new(); @@ -809,6 +821,8 @@ fn sanitize_field_name(name: &str) -> String { if result.is_empty() { "_col".into() + } else if RUST_KEYWORDS.contains(&result.as_str()) { + format!("r#{}", result) } else { result } @@ -1044,6 +1058,24 @@ mod helper_tests { #[case("name_with_trailing_space ", "name_with_trailing_space_")] #[case("", "_col")] #[case("a", "a")] + // Reserved keywords should be prefixed with r# + #[case("type", "r#type")] + #[case("ref", "r#ref")] + #[case("mod", "r#mod")] + #[case("fn", "r#fn")] + #[case("let", "r#let")] + #[case("mut", "r#mut")] + #[case("pub", "r#pub")] + #[case("self", "r#self")] + #[case("Self", "r#Self")] + #[case("match", "r#match")] + #[case("async", "r#async")] + #[case("await", "r#await")] + #[case("abstract", "r#abstract")] + // Non-reserved words should not be prefixed + #[case("types", "types")] + #[case("reference", "reference")] + #[case("module", "module")] fn test_sanitize_field_name(#[case] input: &str, #[case] expected: &str) { assert_eq!(sanitize_field_name(input), expected); }