欢迎加入开源鸿蒙PC社区: https://harmonypc.csdn.net/
欢迎在PC社区平台申请新建项目:https://atomgit.com/OpenHarmonyPCDeveloper
AtomGit 仓库地址:https://atomgit.com/OpenHarmonyPCDeveloper/ohos_rust_cargo

本文讲解鸿蒙 PC 端 Rust 开发环境搭建,鸿蒙基于 musl 库、强制二进制签名,无法直接使用通用 Linux 编译产物。需借助鸿蒙专属包管理器 Harmonybrew,提供两套编译方案:方案一安装 llvm-gcc-compat,零配置开箱即用;方案二仅安装 ohos-sdk,需手动配置 Cargo 链接器,二者都依托 ohos-sdk 完成自动签名编译。

可以来参考一下这个文章搭建环境OpenHarmony 鸿蒙 PC + CodeArts IDE 实现 Rust开发完整开发环境搭建指南


一、库是什么 & 核心作用

convert_case 是专门做字符串命名风格互相转换的轻量 Rust 库,开发中高频场景:
前后端字段命名转换、结构体字段驼峰/下划线互转、文件命名、数据库字段、路由名、常量名等。

支持全部主流命名风格

  1. snake:下划线小写 user_name_info(数据库、rust变量)
  2. screaming_snake:全大写下划线 USER_NAME_INFO(常量)
  3. kebab:短横线小写 user-name-info(URL、文件名、css)
  4. camel:小驼峰 userNameInfo(JS/前端JSON)
  5. pascal:大驼峰 UserNameInfo(Rust/Java 结构体、类名)
  6. lower 纯小写、upper 纯大写

业务使用场景

  1. 后端Rust结构体(snake)序列化JSON自动转小驼峰 camel
  2. 数据库字段下划线 ↔ 前端JSON驼峰互转
  3. 代码生成工具:表名生成结构体、常量名
  4. 路由路径、文件名统一格式转换
  5. 日志、错误提示统一命名格式化

二、安装依赖

cargo add convert_case

Cargo.toml

[dependencies]
convert_case = "0.6"

请添加图片描述

三、完整无报错 main.rs

覆盖所有常用格式、批量转换、混合大小写兼容

use convert_case::{Case, Casing};

fn main() {
    // 原始混合格式字符串
    let raw = "userNameInfo_age-data";
    println!("原始字符串: {raw}\n");

    // 1. snake_case 小写下划线(rust变量、数据库字段)
    let snake = raw.to_case(Case::Snake);
    println!("Snake(下划线小写):    {snake}");

    // 2. UpperSnake 全大写下划线(常量,替代不存在的 ScreamingSnake)
    let upper_snake = raw.to_case(Case::UpperSnake);
    println!("UpperSnake(常量大写): {upper_snake}");

    // 3. kebab-case 短横线分隔
    let kebab = raw.to_case(Case::Kebab);
    println!("Kebab(短横线):        {kebab}");

    // 4. camelCase 小驼峰(前端JSON)
    let camel = raw.to_case(Case::Camel);
    println!("Camel(小驼峰):        {camel}");

    // 5. PascalCase 大驼峰(结构体/类名)
    let pascal = raw.to_case(Case::Pascal);
    println!("Pascal(大驼峰):       {pascal}");

    // 6. 纯小写、纯大写
    let lower = raw.to_case(Case::Lower);
    let upper = raw.to_case(Case::Upper);
    println!("Lower(全小写):        {lower}");
    println!("Upper(全大写):        {upper}");

    println!("\n===== 多格式统一转换测试 =====");
    let test_list = [
        "order_id",
        "OrderId",
        "order-id",
        "ORDER_ID",
        "orderId",
    ];
    for s in test_list {
        let camel = s.to_case(Case::Camel);
        let snake = s.to_case(Case::Snake);
        println!("{s:15} → camel:{camel:12} snake:{snake}");
    }

    println!("\n===== 业务场景:数据库字段 ↔ JSON驼峰 =====");
    let db_field = "user_phone_number";
    let json_field = db_field.to_case(Case::Camel);
    println!("数据库下划线字段: {db_field}");
    println!("前端JSON驼峰字段: {json_field}");

    // 代码生成示例:表名转结构体、常量名
    println!("\n===== 代码生成示例 =====");
    let table_name = "order_detail";
    let struct_name = table_name.to_case(Case::Pascal);
    let const_name = table_name.to_case(Case::UpperSnake);
    println!("数据表 {} → 结构体 struct {}", table_name, struct_name);
    println!("数据表 {} → 常量 const {}: u64 = 1;", table_name, const_name);
}

请添加图片描述

运行

cargo run

convert_case 是专门用来字符串命名风格互相转换的轻量库,后端开发、代码生成、数据库与JSON字段互转高频工具。
能自动识别混合分隔符(下划线_、短横线-、驼峰大小写分界),统一转换成目标命名规范。


一、依赖引入

use convert_case::{Case, Casing};

convert_case 是 Rust 专门做字符串命名风格互转的第三方 crate,支持所有开发常用命名格式:下划线、驼峰、短横线、常量大写等。
使用前需要在 Cargo.toml 添加依赖:

[dependencies]
convert_case = "0.6"
  • Case:枚举,代表目标格式(Snake / Camel / Pascal 等)
  • Casing:trait,给字符串增加 .to_case() 转换方法

二、main 入口基础转换演示

let raw = "userNameInfo_age-data";
println!("原始字符串: {raw}\n");

原始混合字符串同时包含小驼峰、下划线、短横线,用来测试库自动分割单词的能力。

1. Snake 小写下划线(Rust变量、数据库字段)

let snake = raw.to_case(Case::Snake);
// 输出:user_name_info_age_data

所有单词小写,单词之间用下划线分隔,后端数据库表字段、rust普通变量标准格式。

2. UpperSnake 全大写下划线(常量)

let upper_snake = raw.to_case(Case::UpperSnake);
// 输出:USER_NAME_INFO_AGE_DATA

全大写+下划线,Rust/Go/C++ 常量专用格式,行业俗称 screaming snake case。

3. Kebab 短横线分隔(URL、前端css类名)

let kebab = raw.to_case(Case::Kebab);
// 输出:user-name-info-age-data

单词小写、横线隔开,网页路由、CSS class、文件命名常用。

4. Camel 小驼峰(JSON、JS/TS接口字段)

let camel = raw.to_case(Case::Camel);
// 输出:userNameInfoAgeData

第一个单词小写,后续每个单词首字母大写,前后端交互 JSON 标准字段格式。

5. Pascal 大驼峰(结构体、类、枚举名)

let pascal = raw.to_case(Case::Pascal);
// 输出:UserNameInfoAgeData

每个单词首字母全部大写,Rust struct、enum、TypeScript class 命名规范。

6. Lower / Upper 纯小写、纯大写

let lower = raw.to_case(Case::Lower);
let upper = raw.to_case(Case::Upper);

单纯把所有字符转小写/大写,不做单词分隔,简单文本统一大小写场景用。

三、多格式统一标准化测试

let test_list = [
    "order_id",
    "OrderId",
    "order-id",
    "ORDER_ID",
    "orderId",
];
for s in test_list {
    let camel = s.to_case(Case::Camel);
    let snake = s.to_case(Case::Snake);
    println!("{s:15} → camel:{camel:12} snake:{snake}");
}

核心作用:无论输入是什么杂乱格式,都能统一转换成指定格式
比如 order_id / OrderId / order-id 全部能标准化为统一的 camel、snake,适合做参数统一、数据字段映射。

四、业务场景:数据库字段 ↔ JSON 驼峰

let db_field = "user_phone_number";
let json_field = db_field.to_case(Case::Camel);
println!("数据库下划线字段: {db_field}");
println!("前端JSON驼峰字段: {json_field}");

后端最常用场景:
数据库存储是下划线 user_phone_number,返回给前端 JSON 需要转小驼峰 userPhoneNumber,序列化/反序列化字段映射核心工具。

五、代码生成场景(代码脚手架、ORM工具)

let table_name = "order_detail";
let struct_name = table_name.to_case(Case::Pascal);
let const_name = table_name.to_case(Case::UpperSnake);
println!("数据表 {} → 结构体 struct {}", table_name, struct_name);
println!("数据表 {} → 常量 const {}: u64 = 1;", table_name, const_name);

适合 ORM、代码生成器:
数据库表名 order_detail

  • 转 Pascal 作为结构体名称:OrderDetail
  • 转 UpperSnake 作为表ID常量:ORDER_DETAIL

整体核心能力总结

  1. 自动识别混合分隔符(下划线、横线、驼峰)拆分单词,不用自己分割字符串;
  2. 一行代码完成任意命名格式互相转换;
  3. 覆盖后端开发高频场景:数据库映射、JSON序列化、常量定义、结构体生成、URL命名;
  4. 无复杂正则,性能稳定,Rust项目做字段转换首选库。

运行输出示例

原始字符串: userNameInfo_age-data

Snake(下划线小写):    user_name_info_age_data
UpperSnake(常量大写): USER_NAME_INFO_AGE_DATA
Kebab(短横线):        user-name-info-age-data
Camel(小驼峰):        userNameInfoAgeData
Pascal(大驼峰):       UserNameInfoAgeData
Lower(全小写):        usernameinfo_age-data
Upper(全大写):        USERNAMEINFO_AGE-DATA

===== 多格式统一转换测试 =====
order_id        → camel:orderId      snake:order_id
OrderId         → camel:orderId      snake:order_id
order-id        → camel:orderId      snake:order_id
ORDER_ID        → camel:orderId      snake:order_id
orderId         → camel:orderId      snake:order_id

===== 业务场景:数据库字段 ↔ JSON驼峰 =====
数据库下划线字段: user_phone_number
前端JSON驼峰字段: userPhoneNumber

===== 代码生成示例 =====
数据表 order_detail → 结构体 struct OrderDetail
数据表 order_detail → 常量 const ORDER_DETAIL: u64 = 1;

一、Cargo 依赖配置

[dependencies]
convert_case = "0.6"

导入核心类型:

use convert_case::{Case, Casing};
  • Casing trait:给所有 &str / String 挂载 .to_case(Case) 转换方法
  • Case 枚举:所有支持的命名风格常量

二、基础转换部分逐段解析

原始字符串:"userNameInfo_age-data"
混合了小驼峰、下划线、短横线三种分隔符,库会自动拆分单词列表:
拆分单词序列:["user", "name", "info", "age", "data"]
所有转换都是基于这套拆分后的单词重新拼接。

1. Case::Snake — snake_case 小写下划线

let snake = raw.to_case(Case::Snake);
println!("Snake(下划线小写):    {snake}");

输出:user_name_info_age_data
适用场景:
Rust 变量、函数名、数据库表字段、SQL 列名。

2. Case::UpperSnake — SCREAMING_SNAKE 全大写下划线

let upper_snake = raw.to_case(Case::UpperSnake);
println!("UpperSnake(常量大写): {upper_snake}");

输出:USER_NAME_INFO_AGE_DATA
适用场景:Rust / C / Java 全局常量、枚举标识。

3. Case::Kebab — kebab-case 短横线小写

let kebab = raw.to_case(Case::Kebab);
println!("Kebab(短横线):        {kebab}");

输出:user-name-info-age-data
适用场景:URL路径、前端CSS class、文件名、接口路由。

4. Case::Camel — camelCase 小驼峰(首字母小写)

let camel = raw.to_case(Case::Camel);
println!("Camel(小驼峰):        {camel}");

输出:userNameInfoAgeData
适用场景:JavaScript/TypeScript JSON 对象字段、前端变量。

5. Case::Pascal — PascalCase 大驼峰(首字母大写)

let pascal = raw.to_case(Case::Pascal);
println!("Pascal(大驼峰):       {pascal}");

输出:UserNameInfoAgeData
适用场景:Rust struct / enum、Java Class、TS Interface。

6. Case::Lower / Case::Upper 纯大小写

let lower = raw.to_case(Case::Lower);
let upper = raw.to_case(Case::Upper);
println!("Lower(全小写):        {lower}");
println!("Upper(全大写):        {upper}");
  • Lower:usernameinfo_age-data(仅全部小写,不删除分隔符)
  • Upper:USERNAMEINFO_AGE-DATA(仅全部大写,保留原有符号)
    和 Snake/Kebab 区别:不会重新拆分重组单词,只改字母大小写。

三、多格式统一转换测试

let test_list = [
    "order_id",
    "OrderId",
    "order-id",
    "ORDER_ID",
    "orderId",
];
for s in test_list {
    let camel = s.to_case(Case::Camel);
    let snake = s.to_case(Case::Snake);
    println!("{s:15} → camel:{camel:12} snake:{snake}");
}

核心特性:输入任意风格,输出统一结果

无论输入是下划线、大驼峰、短横线、常量大写、小驼峰,底层都会拆分成 ["order", "id"],再生成目标格式:
所有输入转 camel 统一得到 orderId
所有输入转 snake 统一得到 order_id

输出结果:

order_id       → camel:orderId    snake:order_id
OrderId        → camel:orderId    snake:order_id
order-id       → camel:orderId    snake:order_id
ORDER_ID       → camel:orderId    snake:order_id
orderId        → camel:orderId    snake:order_id

业务价值:数据库同步JSON、代码生成时不用兼容各种输入格式,统一转换即可。

四、业务场景1:数据库字段 ↔ JSON 前端字段

let db_field = "user_phone_number";
let json_field = db_field.to_case(Case::Camel);
println!("数据库下划线字段: {db_field}");
println!("前端JSON驼峰字段: {json_field}");

输出:

数据库下划线字段: user_phone_number
前端JSON驼峰字段: userPhoneNumber

配套 serde 经典联用场景

配合序列化自动转换字段名,不用手写大量 #[serde(rename)]

// 数据库 snake → JSON camel 自动映射
#[serde(rename_all = "camelCase")]
struct User {
    user_phone_number: String
}

开发CRUD工具、ORM框架、代码生成器必备组合。

五、业务场景2:数据库表名生成 Rust 代码

let table_name = "order_detail";
let struct_name = table_name.to_case(Case::Pascal);
let const_name = table_name.to_case(Case::UpperSnake);
println!("数据表 {} → 结构体 struct {}", table_name, struct_name);
println!("数据表 {} → 常量 const {}: u64 = 1;", table_name, const_name);

输出:

数据表 order_detail → 结构体 struct OrderDetail
数据表 order_detail → 常量 const ORDER_DETAIL: u64 = 1;

使用场景:数据库代码生成工具

读取表名 order_detail

  1. 生成实体结构体 struct OrderDetail(Pascal)
  2. 生成表名常量 const ORDER_DETAIL_TABLE(UpperSnake)
  3. 字段转小驼峰用于接口返回(Camel)
  4. 字段转下划线用于SQL查询(Snake)

六、底层核心原理(为什么混合字符串也能正确转换)

  1. 分词规则:
    • 下划线 _、短横线 -、空格 直接作为单词分隔
    • 大小写交界处拆分:userName → user + Name
  2. 全部拆分后得到纯单词数组,无视原有分隔符
  3. 根据目标 Case 规则重新拼接单词
    • Snake:单词小写,_ 连接
    • Camel:首单词小写,其余首字母大写,无分隔符
    • Pascal:全部单词首字母大写,无分隔符
    • Kebab:单词小写,- 连接

七、各 Case 场景速查表

Case 枚举 样式 典型用途
Snake user_info Rust变量、数据库字段
UpperSnake USER_INFO 常量、枚举值
Camel userInfo JS/JSON字段、前端变量
Pascal UserInfo struct、类名、接口
Kebab user-info URL、CSS、文件名
Lower / Upper 仅改大小写 简单文本格式化

八、常见搭配库实战场景

  1. serde + convert_case:ORM 实体自动转换数据库/JSON字段
  2. sqlx + convert_case:数据库表名自动生成Rust结构体
  3. 代码生成工具(build.rs):批量转换命名规范
  4. HTTP接口:统一入参驼峰 ↔ 数据库下划线互转
  5. 配置文件解析:不同命名风格配置标准化

四、核心API说明

1. trait Casing(自动给 &str/String 增加方法)

  • .to_case(Case::X):一键转为目标命名风格
  • .to_words():把字符串拆分为单词 Vec,可自定义拼接

2. Case 枚举全部变体

枚举值 输出示例 使用场景
Snake user_info Rust变量、数据库表字段
ScreamingSnake USER_INFO 常量定义 const MAX_SIZE: u32 = 100
Kebab user-info URL路径、文件名称、CSS类名
Camel userInfo JS/TS、JSON前端返回字段
Pascal UserInfo Rust struct / enum、Java Class
Lower userinfo 全小写无分隔
Upper USERINFO 全大写无分隔

3. 核心特性:自动分词

无论输入是驼峰、下划线、横线混合,库内部自动分割单词,不用手动清洗字符串:
输入 userName_age-id 统一拆分为 ["user", "name", "age", "data"],再重新拼接为目标格式。

五、高频实战拓展场景

场景1:配合serde全局结构体驼峰序列化(代码生成常用)

不需要手动每个字段加 rename,批量转换所有字段名:

use convert_case::{Case, Casing};

fn db_to_json_field(db_name: &str) -> String {
    db_name.to_case(Case::Camel)
}

fn json_to_db_field(json_name: &str) -> String {
    json_name.to_case(Case::Snake)
}

fn main() {
    let db_cols = ["user_id", "order_price", "create_time"];
    for col in db_cols {
        println!("db:{col} → json:{}", db_to_json_field(col));
    }
}

场景2:代码生成工具(ORM/表生成结构体)

// 数据库表名 order_detail → Pascal 结构体 OrderDetail
let table_name = "order_detail";
let struct_name = table_name.to_case(Case::Pascal);
println!("表 {table_name} 对应结构体 struct {struct_name}");

场景3:生成常量名

let field = "max_page_size";
let const_name = field.to_case(Case::ScreamingSnake);
println!("const {const_name}: u32 = 100;");

六、库优势

  1. 零依赖、体积极小、编译速度快
  2. 自动兼容各种混合分隔符输入,容错性强
  3. API极简,只需要 .to_case() 一行转换
  4. 支持所有行业标准命名规范,覆盖前后端、数据库、代码生成全场景
  5. 无运行时开销,纯编译期逻辑,性能极高

更多推荐