sea-orm:异步动态 ORM
SeaORM 是一种关系 ORM,可帮助您在 Rust 中构建轻量级和并发的 Web 服务。
来看个 Select 的例子:
// find all models
let cakes: Vec<cake::Model> = Cake::find().all(db).await?;
// find and filter
let chocolate: Vec<cake::Model> = Cake::find()
.filter(cake::Column::Name.contains("chocolate"))
.all(db)
.await?;
// find one model
let cheese: Option<cake::Model> = Cake::find_by_id(1).one(db).await?;
let cheese: cake::Model = cheese.unwrap();
// find related models (lazy)
let fruits: Vec<fruit::Model> = cheese.find_related(Fruit).all(db).await?;
// find related models (eager)
let cake_with_fruits: Vec<(cake::Model, Vec<fruit::Model>)> =
Cake::find().find_with_related(Fruit).all(db).await?;
设计思想:「分层抽象」,几乎所有的东西都是可配置的,编译时不知道底层数据库是什么(数据库无关)。使用 API 时有不同的阶段,有两个维度来导航 SeaORM 代码库,“阶段” 和 “抽象”。
- 首先是「申报阶段」,实体和它们之间的关系是用 EntityTrait、ColumnTrait 和 RelationTrait 等定义的。
- 其次是「查询构建阶段」
- 最顶层是
Entity
的find*
、insert
、update
、delete
方法,可以直观的进行基本的 CRUD 操作。 - 再往下一层是
Select
、Insert
、Update
和Delete
结构,它们每个都有自己的 API 用于更高级的操作。 - 再往下一层是 SeaQuery
SelectStatement
、InsertStatement
、UpdateStatement
和DeleteStatement
,它们有丰富的 API 供您处理 SQL 语法树。
- 最顶层是
- 三是执行阶段。一组单独的结构,
Selector
、Inserter
、Updater
和Deleter
,负责针对数据库连接执行语句。 - 最后是解析阶段,此时查询结果被转换为 Rust 结构体以供使用。
因为只有执行和解析阶段是特定于数据库的,我们可以通过替换它们来使用不同的驱动程序。
与 Diesel
对比:
Diesel | SeaORM |
---|---|
Sync | Async |
Static | Dynamic |
Native Driver | Pure Rust |
官网:https://www.sea-ql.org/SeaORM/
GitHub:https://github.com/SeaQL/sea-orm
block-ciphers:用纯 Rust 编写的分组密码算法集合
支持多种算法,使用方法如下:
use aes::Aes128;
use block_modes::{BlockMode, Cbc};
use block_modes::block_padding::Pkcs7;
use hex_literal::hex;
// create an alias for convenience
type Aes128Cbc = Cbc<Aes128, Pkcs7>;
let key = hex!("000102030405060708090a0b0c0d0e0f");
let iv = hex!("f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff");
let plaintext = b"Hello world!";
let cipher = Aes128Cbc::new_from_slices(&key, &iv).unwrap();
// buffer must have enough space for message+padding
let mut buffer = [0u8; 32];
// copy message to the buffer
let pos = plaintext.len();
buffer[..pos].copy_from_slice(plaintext);
let ciphertext = cipher.encrypt(&mut buffer, pos).unwrap();
assert_eq!(ciphertext, hex!("1b7a4c403124ae2fb52bedc534d82fa8"));
// re-create cipher mode instance and decrypt the message
let cipher = Aes128Cbc::new_from_slices(&key, &iv).unwrap();
let mut buf = ciphertext.to_vec();
let decrypted_ciphertext = cipher.decrypt(&mut buf).unwrap();
assert_eq!(decrypted_ciphertext, plaintext);
GitHub:https://github.com/RustCrypto/block-ciphers
darkfi:匿名的 DeFi 网络
DarkFi 是一个匿名的 DeFi 网络。它的目标是提供灵活的私有原语,可以用来创建任何类型的应用程序。 DarkFi 使用零知识密码学的进步,并创建了一种合同语言和开发人员工具包,旨在使匿名工程对开发人员具有高度的可访问性。
官网:https://dark.fi/
GitHub:https://github.com/darkrenaissance/darkfi
tunneler:隧道工具
Rust 实现的,通过 TCP、(相互)TLS 或 DNS(权威服务器或直接连接)隧道传输 TCP 或 UDP 流量。整体架构如下:
图片地址:https://img.gejiba.com/image/zqi53
每个可执行文件包含 2 个组件,通过客户端 stream 通道(字节读取器和写入器元组)进行通信:
- 客户端监听器绑定套接字并将传入和传出的流量转为新的流。
- 客户端 tunneler 将流读取器和写入器转为隧道协议。
- 服务器 untunneler 根据隧道协议绑定套接字并将隧道流量转换回原始流。
- 服务器转发器将流写入器和读取器转换回流量。
基于 TCP 的流量被简单地转换为流。 基于 UDP 的流量转换取决于隧道协议。基于 UDP 的流量还需要一种方法来识别现有客户端以继续其会话。解决方案是内存中的客户端缓存,它将客户端的标识符映射到其对应的流。
GitHub:https://github.com/dlemel8/tunneler
gateway-rs:Helium Light 网关
Helium 网关应用程序是一项旨在在基于 Linux 的 LoRaWAN 网关上运行的服务。它旨在与典型的 LoRa 数据包转发器一起运行,并通过 Semtech 的网关消息传递协议(GWMP,使用 JSON v1 或 v2)进行连接。
Helium Gateway 应用程序会做两件事:
- 从网关服务获取区块链上下文,例如路由表和 OUI 端点;这意味着应用程序不需要维护区块链副本的完整分类帐。
- 将数据包连接并路由到适当的 OUI 端点(如 Helium 路由器)。
GitHub:https://github.com/helium/gateway-rs
FileClassed:批处理文件管理器
高效、轻量、可配置的文件管理器。实现很简单:它在某些目录(可以配置)中取一个文件,然后组织它们,最后将它们移动到一个目录(也可以配置)。
大概就是这么个效果:
config file :
---
dest: ~/Documents
dirs:
- ~/Documents-source
once: false
timeinfo: false
static_mode: false
sleep: 1000
codes:
hst: History
cnt: Century
cs: Computer Science
en: English
chin: Chinese
mt: Mathematics
sp: Sports
phy: Physics
ch: Chemestry
glb: Global
gr: Greek
fr: French
asg: Assignments
Before :
~/Documents-source/hst/<fr> <hst>.18th <cnt>.Consulate.pdf
~/Documents-source/Computer/cs.algorithms and data structures.dvi
~/Documents-source/very/deep/meaning/gr.statues weren't white.mp4
~/Documents-source/such/nested/asg.mt.integration.tex
~/Documents-source/chin.Great Wall.odt
After :
~/Documents/French History/18th Century/Consulate.pdf
~/Documents/Computer Science/algorithms and data structures.dvi
~/Documents/Greek/statues weren't white.mp4
~/Documents/Assignments/Mathematics/integration.tex
~/Documents/Chinese/Great Wall.odt
注意 Before 中每一个文件的「最后一部分」,他们会被转换为 After 中的目录。
GitHub:https://github.com/Eolien55/FileClassed
rust-kernel-barebones:Rust 内核和配置脚本
一个最小的 64 位 Rust 内核和一堆配置脚本,可用于使用 Nightly-Rust 编译器引导操作系统开发。使用 Rust OsDev 社区构建的工具如 xbuild、bootimage、bootloader crates,并将所有这些工具配置为协同工作。从而开发人员不必担心 toochain 的配置。工具链构建并配置项目以使用 x86_64-unknown-none
目标。 一些功能包括:
- 配置整个环境的脚本。
- 构建内核并使用 Qemu 模拟的脚本。
- VS Code RLS 配置。
GitHub:https://github.com/Narasimha1997/rust-kernel-barebones
simple-undo:undo和redo
使用方法如下:
use simple_undo::Undo;
let mut message = Undo::new(String::new());
message.update(|text| text.push_str("Simple ")); // 步骤1
message.update(|text| text.push_str("undo !")); // 步骤2
assert_eq!(*message, "Simple undo !");
message.undo(); // "Simple " 撤销步骤2
message.undo(); // "" 撤销步骤1
message.redo(); // "Simple " 再执行步骤1
message.update(|text| text.push_str("redo !"));
assert_eq!(*message, "Simple redo !");
let result: String = message.unwrap();
assert_eq!(result, "Simple redo !");
GitHub:https://github.com/didibear/simple-undo
学习资源
- Understand Rust's Borrow Checker in 5 Minutes - YouTube
- 提升
mongodb
性能的经验:Making slow Rust code fast | patrickfreed's blog - 泛型:jeffa.io - Rust Guide: Generics Demystified Part 1
From 日报小组 长琴
社区学习交流平台订阅:
评论区
写评论还没有评论