这是一个完全重写的项目,旧的客户端已经被放弃。
MongoDB在Rust方面拥有长时间的研究。早在2013年,两名实习生就针对Rust 0.7的数据库编写了原型Rust驱动程序,但是由于Rust语言发展迅速,并且当时进rust行了重大更改,因此这套代码最终被淘汰。
Rust驱动程序支持3.6以上的所有MongoDB服务器版本,并且需要Rust 1.39或更高版本。它使用rustlscrate以及SCRAM-SHA-1和SCRAM-SHA-256身份验证实现本机TLS,完全支持独立实例、副本集和分片群集 。
该驱动程序支持连接到MongoDB Atlas和本地部署。通过bson crate驱动程序支持使用serde对从数据库写入的文档进行序列化和反序列化。
更多详细信息和使用方法参见https://www.mongodb.com/blog/post/announcing-the-official-mongodb-rust-driver
从某些代码中可以最容易地看出这是更符合人体工程学的示例,这是先前版本的TrustS-DNS(HTTPS请求处理程序)中的示例:
pub fn h2_handler(
handler: Arc>,
io: I,
src_addr: SocketAddr,
dns_hostname: Arc,
) -> impl Future-
where
T: RequestHandler,
I: AsyncRead + AsyncWrite,
{
// Start the HTTP/2.0 connection handshake
server::handshake(io)
.map_err(|e| warn!("h2 handshake error: {}", e))
.and_then(move |h2| {
let dns_hostname = dns_hostname.clone();
// Accept all inbound HTTP/2.0 streams sent over the
// connection.
h2.map_err(|e| warn!("h2 failed to receive message: {}", e))
.for_each(move |(request, respond)| {
debug!("Received request: {:#?}", request);
let dns_hostname = dns_hostname.clone();
let handler = handler.clone();
let responder = HttpsResponseHandle(Arc::new(Mutex::new(respond)));
https_server::message_from(dns_hostname, request)
.map_err(|e| warn!("h2 failed to receive message: {}", e))
.and_then(|bytes| {
BinDecodable::from_bytes(&bytes)
.map_err(|e| warn!("could not decode message: {}", e))
})
.and_then(move |message| {
debug!("received message: {:?}", message);
server_future::handle_request(
message,
src_addr,
handler.clone(),
responder,
)
})
})
})
.map_err(|_| warn!("error in h2 handler"))
}
上述示例说明了如何将较早的Future组合器一起使用,但是这使得编写一些复杂的代码成为可能。此async fn
版本更加简单:
pub async fn h2_handler(
handler: Arc>,
io: I,
src_addr: SocketAddr,
dns_hostname: Arc,
) where
T: RequestHandler,
I: AsyncRead + AsyncWrite + Unpin,
{
let dns_hostname = dns_hostname.clone();
// Start the HTTP/2.0 connection handshake
let mut h2 = match server::handshake(io).await {
Ok(h2) => h2,
Err(err) => {
warn!("handshake error from {}: {}", src_addr, err);
return;
}
};
// Accept all inbound HTTP/2.0 streams sent over the
// connection.
while let Some(next_request) = h2.accept().await {
let (request, respond) = match next_request {
Ok(next_request) => next_request,
Err(err) => {
warn!("error accepting request {}: {}", src_addr, err);
return;
}
};
debug!("Received request: {:#?}", request);
let dns_hostname = dns_hostname.clone();
let handler = handler.clone();
let responder = HttpsResponseHandle(Arc::new(Mutex::new(respond)));
match https_server::message_from(dns_hostname, request).await {
Ok(bytes) => handle_request(bytes, src_addr, handler, responder).await,
Err(err) => warn!("error while handling request from {}: {}", src_addr, err),
};
// we'll continue handling requests from here.
}
}
此代码更直接,容易阅读,也会更讨巧。这是异步/等待的最大优势,您可以以更简单的方式编写代码。
更多细节前往GitHub博客查看详细内容。
这个工程是以为技术极客所创造,它仍然不及正式版本软件的功能完善,因此除非您愿意做出贡献,否则请不要尝试使用它。
thatcord的原型Rust Discord库支持tokio 0.2,futures 0.3和异步/等待。由于过于强调原型,因为它目前只能接收,不能发送。并且仅支同时持两个进程。关于文献资料,目前也十分缺乏。但是,这个examples/
目录对于该库的当前完整功能应该足够。
[dependencies]
thatcord = { git = "https://github.com/Admicos/thatcord" }
更多细节及工程克隆请访问GitHub
From 日报小组 @Lance
日报订阅地址:
独立日报订阅地址:
Telgram Channel
阿里云语雀订阅
Steemit
GitHub
社区学习交流平台订阅:
Rust.cc论坛: 支持rss
Rust Force: 支持rss
微信公众号:Rust语言学习交流