---
<a id="en"></a>
# tosql_derive : Derive Macro for tosql
Automatically implements the `ToSqlTrait` trait for Rust structs, simplifying SQL serialization.
## Table of Contents
- [Introduction](#introduction)
- [Features](#features)
- [Usage](#usage)
- [Design](#design)
- [Tech Stack](#tech-stack)
- [Directory Structure](#directory-structure)
## Introduction
`tosql_derive` is a procedural macro that generates the boilerplate code required to implement the `tosql::ToSqlTrait` trait. It analyzes your struct fields and generates the appropriate serialization logic, mapping Rust types to `kind2sql::Kind` variants.
## Features
- **Automatic Derivation**: Simply add `#[derive(ToSql)]` to your struct.
- **Type Mapping**: Automatically maps Rust primitive types (`u8`, `i32`, `String`, etc.) to SQL types.
- **Variable Byte Encoding**: Handles efficient encoding for `String`, `Bytes`, `u32`, and `u64`.
- **Seamless Integration**: Designed to work perfectly with the `tosql` and `kind2sql` ecosystem.
## Usage
Add `tosql` and `tosql_derive` to your dependencies:
```toml
[dependencies]
tosql = "0.1"
tosql_derive = "0.1"
```
Then derive `ToSql` on your struct:
```rust
use tosql_derive::ToSql;
#[derive(ToSql)]
struct User {
id: u64,
username: String,
is_active: u8,
}
// Now User implements ToSqlTrait automatically
// You can use it with kind2sql to generate SQL inserts
```
## Design
The macro parses the struct definition and performs the following mappings:
- **Integers**: Mapped to their corresponding `Kind` (e.g., `u8` -> `Kind::U8`). `u32` and `u64` are treated as variable-byte encoded integers to save space.
- **Strings**: Mapped to `Kind::String`. The length is encoded using variable-byte encoding before the string data.
- **Bytes**: `Vec<u8>`, `Bytes`, and `bytes::Bytes` are mapped to `Kind::Bytes`.
The generated `dump` method efficiently writes these values into a `BytesMut` buffer without unnecessary copying.
## Tech Stack
- [Rust](https://www.rust-lang.org/)
- `syn`: For parsing Rust code.
- `quote`: For generating Rust code.
- `proc-macro2`: For manipulating token streams.
## Related Crates
- [tosql](https://docs.rs/crate/tosql): The core trait definition.
- [to_mysql](https://docs.rs/crate/to_mysql): MySQL SQL generation logic.
- [tosql_meta](https://docs.rs/crate/tosql_meta): Metadata definition for SQL structs.
## Directory Structure
```
.
├── Cargo.toml # Package manifest
├── readme/ # Documentation
│ ├── en.md # English README
│ └── zh.md # Chinese README
└── src/
└── lib.rs # Macro implementation
```
---
## About
This project is an open-source component of [js0.site ⋅ Refactoring the Internet Plan](https://js0.site).
We are redefining the development paradigm of the Internet in a componentized way. Welcome to follow us:
* [Google Group](https://groups.google.com/g/js0-site)
* [js0site.bsky.social](https://bsky.app/profile/js0site.bsky.social)
---
<a id="zh"></a>
# tosql_derive : tosql 的派生宏
自动为 Rust 结构体实现 `ToSqlTrait` trait,简化 SQL 序列化过程。
## 目录
- [简介](#简介)
- [特性](#特性)
- [使用演示](#使用演示)
- [设计思路](#设计思路)
- [技术栈](#技术栈)
- [目录结构](#目录结构)
## 简介
`tosql_derive` 是一个过程宏,用于生成实现 `tosql::ToSqlTrait` trait 所需的样板代码。它分析结构体字段并生成相应的序列化逻辑,将 Rust 类型映射到 `kind2sql::Kind` 变体。
## 特性
- **自动派生**:只需在结构体上添加 `#[derive(ToSql)]`。
- **类型映射**:自动将 Rust 基本类型(`u8`、`i32`、`String` 等)映射到 SQL 类型。
- **变长字节编码**:处理 `String`、`Bytes`、`u32` 和 `u64` 的高效编码。
- **无缝集成**:设计用于与 `tosql` 和 `kind2sql` 生态系统完美配合。
## 使用演示
在依赖项中添加 `tosql` 和 `tosql_derive`:
```toml
[dependencies]
tosql = "0.1"
tosql_derive = "0.1"
```
然后在结构体上派生 `ToSql`:
```rust
use tosql_derive::ToSql;
#[derive(ToSql)]
struct User {
id: u64,
username: String,
is_active: u8,
}
// 现在 User 自动实现了 ToSqlTrait
// 你可以将其与 kind2sql 结合使用以生成 SQL 插入语句
```
## 设计思路
该宏解析结构体定义并执行以下映射:
- **整数**:映射到相应的 `Kind`(例如 `u8` -> `Kind::U8`)。`u32` 和 `u64` 被视为变长字节编码整数以节省空间。
- **字符串**:映射到 `Kind::String`。在字符串数据之前使用变长字节编码对长度进行编码。
- **字节**:`Vec<u8>`、`Bytes` 和 `bytes::Bytes` 映射到 `Kind::Bytes`。
生成的 `dump` 方法将这些值高效地写入 `BytesMut` 缓冲区,无需不必要的复制。
## 技术栈
- [Rust](https://www.rust-lang.org/)
- `syn`:用于解析 Rust 代码。
- `quote`:用于生成 Rust 代码。
- `proc-macro2`:用于操作令牌流。
## 相关库
- [tosql](https://docs.rs/crate/tosql):核心 trait 定义。
- [to_mysql](https://docs.rs/crate/to_mysql):MySQL SQL 生成逻辑。
- [tosql_meta](https://docs.rs/crate/tosql_meta):SQL 结构体的元数据定义。
## 目录结构
```
.
├── Cargo.toml # 包配置
├── readme/ # 文档
│ ├── en.md # 英文 README
│ └── zh.md # 中文 README
└── src/
└── lib.rs # 宏实现
```
---
## 关于
本项目为 [js0.site ⋅ 重构互联网计划](https://js0.site) 的开源组件。
我们正在以组件化的方式重新定义互联网的开发范式,欢迎关注:
* [谷歌邮件列表](https://groups.google.com/g/js0-site)
* [js0site.bsky.social](https://bsky.app/profile/js0site.bsky.social)