欢迎加入开源鸿蒙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 库,开发中高频场景:
前后端字段命名转换、结构体字段驼峰/下划线互转、文件命名、数据库字段、路由名、常量名等。
支持全部主流命名风格
snake:下划线小写user_name_info(数据库、rust变量)screaming_snake:全大写下划线USER_NAME_INFO(常量)kebab:短横线小写user-name-info(URL、文件名、css)camel:小驼峰userNameInfo(JS/前端JSON)pascal:大驼峰UserNameInfo(Rust/Java 结构体、类名)lower纯小写、upper纯大写
业务使用场景
- 后端Rust结构体(snake)序列化JSON自动转小驼峰 camel
- 数据库字段下划线 ↔ 前端JSON驼峰互转
- 代码生成工具:表名生成结构体、常量名
- 路由路径、文件名统一格式转换
- 日志、错误提示统一命名格式化
二、安装依赖
cargoaddconvert_caseCargo.toml
[dependencies] convert_case = "0.6"三、完整无报错 main.rs
覆盖所有常用格式、批量转换、混合大小写兼容
useconvert_case::{Case,Casing};fnmain(){// 原始混合格式字符串letraw="userNameInfo_age-data";println!("原始字符串: {raw}\n");// 1. snake_case 小写下划线(rust变量、数据库字段)letsnake=raw.to_case(Case::Snake);println!("Snake(下划线小写): {snake}");// 2. UpperSnake 全大写下划线(常量,替代不存在的 ScreamingSnake)letupper_snake=raw.to_case(Case::UpperSnake);println!("UpperSnake(常量大写): {upper_snake}");// 3. kebab-case 短横线分隔letkebab=raw.to_case(Case::Kebab);println!("Kebab(短横线): {kebab}");// 4. camelCase 小驼峰(前端JSON)letcamel=raw.to_case(Case::Camel);println!("Camel(小驼峰): {camel}");// 5. PascalCase 大驼峰(结构体/类名)letpascal=raw.to_case(Case::Pascal);println!("Pascal(大驼峰): {pascal}");// 6. 纯小写、纯大写letlower=raw.to_case(Case::Lower);letupper=raw.to_case(Case::Upper);println!("Lower(全小写): {lower}");println!("Upper(全大写): {upper}");println!("\n===== 多格式统一转换测试 =====");lettest_list=["order_id","OrderId","order-id","ORDER_ID","orderId",];forsintest_list{letcamel=s.to_case(Case::Camel);letsnake=s.to_case(Case::Snake);println!("{s:15} → camel:{camel:12} snake:{snake}");}println!("\n===== 业务场景:数据库字段 ↔ JSON驼峰 =====");letdb_field="user_phone_number";letjson_field=db_field.to_case(Case::Camel);println!("数据库下划线字段: {db_field}");println!("前端JSON驼峰字段: {json_field}");// 代码生成示例:表名转结构体、常量名println!("\n===== 代码生成示例 =====");lettable_name="order_detail";letstruct_name=table_name.to_case(Case::Pascal);letconst_name=table_name.to_case(Case::UpperSnake);println!("数据表 {} → 结构体 struct {}",table_name,struct_name);println!("数据表 {} → 常量 const {}: u64 = 1;",table_name,const_name);}运行
cargorunconvert_case是专门用来字符串命名风格互相转换的轻量库,后端开发、代码生成、数据库与JSON字段互转高频工具。
能自动识别混合分隔符(下划线_、短横线-、驼峰大小写分界),统一转换成目标命名规范。
一、依赖引入
useconvert_case::{Case,Casing};convert_case是 Rust 专门做字符串命名风格互转的第三方 crate,支持所有开发常用命名格式:下划线、驼峰、短横线、常量大写等。
使用前需要在Cargo.toml添加依赖:
[dependencies] convert_case = "0.6"Case:枚举,代表目标格式(Snake / Camel / Pascal 等)Casing:trait,给字符串增加.to_case()转换方法
二、main 入口基础转换演示
letraw="userNameInfo_age-data";println!("原始字符串: {raw}\n");原始混合字符串同时包含小驼峰、下划线、短横线,用来测试库自动分割单词的能力。
1. Snake 小写下划线(Rust变量、数据库字段)
letsnake=raw.to_case(Case::Snake);// 输出:user_name_info_age_data所有单词小写,单词之间用下划线分隔,后端数据库表字段、rust普通变量标准格式。
2. UpperSnake 全大写下划线(常量)
letupper_snake=raw.to_case(Case::UpperSnake);// 输出:USER_NAME_INFO_AGE_DATA全大写+下划线,Rust/Go/C++ 常量专用格式,行业俗称 screaming snake case。
3. Kebab 短横线分隔(URL、前端css类名)
letkebab=raw.to_case(Case::Kebab);// 输出:user-name-info-age-data单词小写、横线隔开,网页路由、CSS class、文件命名常用。
4. Camel 小驼峰(JSON、JS/TS接口字段)
letcamel=raw.to_case(Case::Camel);// 输出:userNameInfoAgeData第一个单词小写,后续每个单词首字母大写,前后端交互 JSON 标准字段格式。
5. Pascal 大驼峰(结构体、类、枚举名)
letpascal=raw.to_case(Case::Pascal);// 输出:UserNameInfoAgeData每个单词首字母全部大写,Rust struct、enum、TypeScript class 命名规范。
6. Lower / Upper 纯小写、纯大写
letlower=raw.to_case(Case::Lower);letupper=raw.to_case(Case::Upper);单纯把所有字符转小写/大写,不做单词分隔,简单文本统一大小写场景用。
三、多格式统一标准化测试
lettest_list=["order_id","OrderId","order-id","ORDER_ID","orderId",];forsintest_list{letcamel=s.to_case(Case::Camel);letsnake=s.to_case(Case::Snake);println!("{s:15} → camel:{camel:12} snake:{snake}");}核心作用:无论输入是什么杂乱格式,都能统一转换成指定格式。
比如order_id/OrderId/order-id全部能标准化为统一的 camel、snake,适合做参数统一、数据字段映射。
四、业务场景:数据库字段 ↔ JSON 驼峰
letdb_field="user_phone_number";letjson_field=db_field.to_case(Case::Camel);println!("数据库下划线字段: {db_field}");println!("前端JSON驼峰字段: {json_field}");后端最常用场景:
数据库存储是下划线user_phone_number,返回给前端 JSON 需要转小驼峰userPhoneNumber,序列化/反序列化字段映射核心工具。
五、代码生成场景(代码脚手架、ORM工具)
lettable_name="order_detail";letstruct_name=table_name.to_case(Case::Pascal);letconst_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
整体核心能力总结
- 自动识别混合分隔符(下划线、横线、驼峰)拆分单词,不用自己分割字符串;
- 一行代码完成任意命名格式互相转换;
- 覆盖后端开发高频场景:数据库映射、JSON序列化、常量定义、结构体生成、URL命名;
- 无复杂正则,性能稳定,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"导入核心类型:
useconvert_case::{Case,Casing};Casingtrait:给所有&str / String挂载.to_case(Case)转换方法Case枚举:所有支持的命名风格常量
二、基础转换部分逐段解析
原始字符串:"userNameInfo_age-data"
混合了小驼峰、下划线、短横线三种分隔符,库会自动拆分单词列表:
拆分单词序列:["user", "name", "info", "age", "data"]
所有转换都是基于这套拆分后的单词重新拼接。
1. Case::Snake — snake_case 小写下划线
letsnake=raw.to_case(Case::Snake);println!("Snake(下划线小写): {snake}");输出:user_name_info_age_data
适用场景:
Rust 变量、函数名、数据库表字段、SQL 列名。
2. Case::UpperSnake — SCREAMING_SNAKE 全大写下划线
letupper_snake=raw.to_case(Case::UpperSnake);println!("UpperSnake(常量大写): {upper_snake}");输出:USER_NAME_INFO_AGE_DATA
适用场景:Rust / C / Java 全局常量、枚举标识。
3. Case::Kebab — kebab-case 短横线小写
letkebab=raw.to_case(Case::Kebab);println!("Kebab(短横线): {kebab}");输出:user-name-info-age-data
适用场景:URL路径、前端CSS class、文件名、接口路由。
4. Case::Camel — camelCase 小驼峰(首字母小写)
letcamel=raw.to_case(Case::Camel);println!("Camel(小驼峰): {camel}");输出:userNameInfoAgeData
适用场景:JavaScript/TypeScript JSON 对象字段、前端变量。
5. Case::Pascal — PascalCase 大驼峰(首字母大写)
letpascal=raw.to_case(Case::Pascal);println!("Pascal(大驼峰): {pascal}");输出:UserNameInfoAgeData
适用场景:Rust struct / enum、Java Class、TS Interface。
6. Case::Lower / Case::Upper 纯大小写
letlower=raw.to_case(Case::Lower);letupper=raw.to_case(Case::Upper);println!("Lower(全小写): {lower}");println!("Upper(全大写): {upper}");- Lower:
usernameinfo_age-data(仅全部小写,不删除分隔符) - Upper:
USERNAMEINFO_AGE-DATA(仅全部大写,保留原有符号)
和 Snake/Kebab 区别:不会重新拆分重组单词,只改字母大小写。
三、多格式统一转换测试
lettest_list=["order_id","OrderId","order-id","ORDER_ID","orderId",];forsintest_list{letcamel=s.to_case(Case::Camel);letsnake=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 前端字段
letdb_field="user_phone_number";letjson_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")]structUser{user_phone_number:String}开发CRUD工具、ORM框架、代码生成器必备组合。
五、业务场景2:数据库表名生成 Rust 代码
lettable_name="order_detail";letstruct_name=table_name.to_case(Case::Pascal);letconst_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:
- 生成实体结构体
struct OrderDetail(Pascal) - 生成表名常量
const ORDER_DETAIL_TABLE(UpperSnake) - 字段转小驼峰用于接口返回(Camel)
- 字段转下划线用于SQL查询(Snake)
六、底层核心原理(为什么混合字符串也能正确转换)
- 分词规则:
- 下划线
_、短横线-、空格 直接作为单词分隔 - 大小写交界处拆分:
userName→ user + Name
- 下划线
- 全部拆分后得到纯单词数组,无视原有分隔符
- 根据目标
Case规则重新拼接单词- Snake:单词小写,
_连接 - Camel:首单词小写,其余首字母大写,无分隔符
- Pascal:全部单词首字母大写,无分隔符
- Kebab:单词小写,
-连接
- Snake:单词小写,
七、各 Case 场景速查表
| Case 枚举 | 样式 | 典型用途 |
|---|---|---|
| Snake | user_info | Rust变量、数据库字段 |
| UpperSnake | USER_INFO | 常量、枚举值 |
| Camel | userInfo | JS/JSON字段、前端变量 |
| Pascal | UserInfo | struct、类名、接口 |
| Kebab | user-info | URL、CSS、文件名 |
| Lower / Upper | 仅改大小写 | 简单文本格式化 |
八、常见搭配库实战场景
serde + convert_case:ORM 实体自动转换数据库/JSON字段sqlx + convert_case:数据库表名自动生成Rust结构体- 代码生成工具(build.rs):批量转换命名规范
- HTTP接口:统一入参驼峰 ↔ 数据库下划线互转
- 配置文件解析:不同命名风格配置标准化
四、核心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,批量转换所有字段名:
useconvert_case::{Case,Casing};fndb_to_json_field(db_name:&str)->String{db_name.to_case(Case::Camel)}fnjson_to_db_field(json_name:&str)->String{json_name.to_case(Case::Snake)}fnmain(){letdb_cols=["user_id","order_price","create_time"];forcolindb_cols{println!("db:{col} → json:{}",db_to_json_field(col));}}场景2:代码生成工具(ORM/表生成结构体)
// 数据库表名 order_detail → Pascal 结构体 OrderDetaillettable_name="order_detail";letstruct_name=table_name.to_case(Case::Pascal);println!("表 {table_name} 对应结构体 struct {struct_name}");场景3:生成常量名
letfield="max_page_size";letconst_name=field.to_case(Case::ScreamingSnake);println!("const {const_name}: u32 = 100;");六、库优势
- 零依赖、体积极小、编译速度快
- 自动兼容各种混合分隔符输入,容错性强
- API极简,只需要
.to_case()一行转换 - 支持所有行业标准命名规范,覆盖前后端、数据库、代码生成全场景
- 无运行时开销,纯编译期逻辑,性能极高