鸿蒙PC适配llvm-gcc-compat编译安装第三方库convert_case,打造Rust 第三方字符串命名风格互相转换

鸿蒙PC适配llvm-gcc-compat编译安装第三方库convert_case,打造Rust 第三方字符串命名风格互相转换

欢迎加入开源鸿蒙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. 日志、错误提示统一命名格式化

二、安装依赖

cargoaddconvert_case

Cargo.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);}

运行

cargorun

convert_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

整体核心能力总结

  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"

导入核心类型:

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

  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 枚举样式典型用途
Snakeuser_infoRust变量、数据库字段
UpperSnakeUSER_INFO常量、枚举值
CameluserInfoJS/JSON字段、前端变量
PascalUserInfostruct、类名、接口
Kebabuser-infoURL、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 枚举全部变体

枚举值输出示例使用场景
Snakeuser_infoRust变量、数据库表字段
ScreamingSnakeUSER_INFO常量定义const MAX_SIZE: u32 = 100
Kebabuser-infoURL路径、文件名称、CSS类名
CameluserInfoJS/TS、JSON前端返回字段
PascalUserInfoRust struct / enum、Java Class
Loweruserinfo全小写无分隔
UpperUSERINFO全大写无分隔

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;");

六、库优势

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