Files
tauri-shadcn-vite-project/docs/Tauri_Naming_Conventions.md

6.9 KiB
Raw Blame History

Tauri 命名规范文档

概述

本文档定义了 SSH Terminal 项目中 Tauri 应用 Rust 端和前端TypeScript/JavaScript之间的数据类型命名规范。通过遵循这些规范可以确保跨语言的类型安全性和一致性。

核心原则

1. 各自遵循语言规范

  • Rust 端: 遵循 Rust 命名规范snake_case 变量/函数PascalCase 类型/枚举)
  • 前端: 遵循 TypeScript 命名规范camelCase 变量/属性PascalCase 类型)
  • 通过 serde 自动转换: 使用 serde 的重命名功能自动处理转换

2. 类型名称保持一致

  • Rust 端: PascalCaseSessionConfig, AuthMethod
  • 前端: PascalCaseSessionConfig, AuthMethod
  • 类型名称在两端保持一致

详细规范

Struct 字段命名

Rust 端规范

  • 使用 snake_case 命名
  • 添加 #[serde(rename_all = "camelCase")] 注解自动转换为 camelCase
#[derive(Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SessionConfig {
    pub host: String,           // Rust: snake_case
    pub port: u16,
    pub user_name: String,      // Rust: snake_case
    pub private_key_path: String, // Rust: snake_case
    pub auth_method: AuthMethod,
}

前端规范

  • 使用 camelCase 命名
  • 与 serde 自动转换后的名称一致
export interface SessionConfig {
    host: string;               // TS: camelCase
    port: number;
    userName: string;           // TS: camelCase
    privateKeyPath: string;     // TS: camelCase
    authMethod: AuthMethod;
}

Enum 变体命名

Rust 端规范

  • 使用 PascalCase 命名
  • 添加 #[serde(rename_all = "camelCase")] 注解自动转换为 camelCase
#[derive(Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum AuthMethod {
    Password { password: String },           // PascalCase
    PublicKey { privateKeyPath: String, passphrase: Option<String> },
}

前端规范

  • 使用 PascalCase 命名Discriminated Union
  • 与 serde 自动转换后的变体名称一致
export type AuthMethod =
    | { Password: { password: string } }      // PascalCase
    | { PublicKey: { privateKeyPath: string; passphrase?: string } };

字段命名对照表

Rust 端 (snake_case) 前端 (camelCase) 示例用途
user_name userName 用户名
private_key_path privateKeyPath 私钥路径
auth_method authMethod 认证方法
connection_id connectionId 连接 ID
terminal_type terminalType 终端类型
keep_alive_interval keepAliveInterval 保活间隔
strict_host_key_checking strictHostKeyChecking 主机密钥检查
video_file videoFile 视频文件

特殊情况处理

1. 保留字段原名

如果某些字段需要保持原名(通常是已经是 camelCase 的字段),可以使用 #[serde(skip_serializing_if = "Option::is_none")] 或单独注解:

#[derive(Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SessionConfig {
    pub name: String,           // name -> name (保持不变)
    #[serde(rename = "id")]      // 显式重命名
    pub session_id: String,
}

2. 单词分隔符

  • snake_case: 使用下划线 _ 分隔
  • camelCase: 使用首字母大写分隔
// Rust: strict_host_key_checking
// TS:  strictHostKeyChecking

3. 缩写处理

  • 缩写词保持原始形式(如 ID, URL, SSH
  • 不要将缩写词转换为小写
pub connection_id: String,      // NOT connection_i_d
// TS: connectionId                // NOT connectionId

实现示例

Rust 端完整示例

use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize, Clone, Debug)]
#[serde(rename_all = "camelCase")]
pub struct SessionConfig {
    pub id: Option<String>,
    pub name: String,
    pub host: String,
    pub port: u16,
    pub username: String,
    pub authMethod: AuthMethod,
    pub terminalType: Option<String>,
    pub columns: Option<u16>,
    pub rows: Option<u16>,
    #[serde(default = "default_strict_host_key_checking")]
    pub strictHostKeyChecking: bool,
    #[serde(default = "default_group")]
    pub group: String,
    #[serde(default = "default_keep_alive_interval")]
    pub keepAliveInterval: u64,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
#[serde(rename_all = "camelCase")]
pub enum AuthMethod {
    Password { password: String },
    PublicKey { privateKeyPath: String, passphrase: Option<String> },
}

前端完整示例

export interface SessionConfig {
    id?: string;
    name: string;
    host: string;
    port: number;
    username: string;
    authMethod: AuthMethod;
    terminalType?: string;
    columns?: number;
    rows?: number;
    strictHostKeyChecking?: boolean;
    group?: string;
    keepAliveInterval?: number;
}

export type AuthMethod =
    | { Password: { password: string } }
    | { PublicKey: { privateKeyPath: string; passphrase?: string } };

验证和测试

1. Rust 端验证

cd src-tauri
cargo check
cargo clippy

2. 前端验证

pnpm tsc --noEmit

3. 交叉验证

  • 测试 Rust 序列化到 JSON
  • 验证前端反序列化是否正确
  • 检查字段名是否匹配

常见错误

错误 1: 未添加 serde 注解

// ❌ 错误
pub struct SessionConfig {
    pub user_name: String,  // 序列化为 user_name (snake_case)
}

// ✅ 正确
#[derive(Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SessionConfig {
    pub user_name: String,  // 序列化为 userName (camelCase)
}

错误 2: 前端类型不匹配

// ❌ 错误
export interface SessionConfig {
    user_name: string;  // 应该是 userName
}

// ✅ 正确
export interface SessionConfig {
    userName: string;  // 与 Rust 端序列化后的名称一致
}

错误 3: Enum 变体命名不一致

// ❌ 错误
pub enum AuthMethod {
    Password,      // 序列化为 "Password" (PascalCase)
    PublicKey,
}

// ✅ 正确
#[derive(Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum AuthMethod {
    Password,      // 序列化为 "password" (camelCase)
    PublicKey,    // 序列化为 "publicKey" (camelCase)
}

工具和辅助

自动检查脚本

可以创建一个脚本来检查 Rust 和前端类型定义的一致性:

# 检查 Rust 端是否缺少 serde 注解
grep -r "pub struct" src-tauri/src | grep -v "#\[serde"

# 检查前端类型定义
grep -r "export interface" src/types

相关资源

更新日志

  • 2026-01-29: 初始版本,定义 Tauri 项目命名规范