クレートエコシステム
Rustの豊富なライブラリ(クレート)を活用する方法を学びます。
crates.io
crates.io はRustの公式パッケージレジストリです。
クレートを探す
- crates.ioで検索
- lib.rs で分類別に探す
- GitHubのAwesome Rustリストを参照
良いクレートの選び方
| 指標 | 確認ポイント |
|---|---|
| ダウンロード数 | 多いほど信頼性が高い傾向 |
| 最終更新 | 活発にメンテナンスされているか |
| ドキュメント | docs.rsで確認 |
| 依存関係 | 少ないほどシンプル |
| ライセンス | MIT/Apache 2.0が一般的 |
主要クレート紹介
シリアライゼーション: serde
[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug)]
struct User {
name: String,
age: u32,
}
fn main() {
let user = User {
name: String::from("太郎"),
age: 25,
};
// JSON化
let json = serde_json::to_string(&user).unwrap();
println!("{}", json);
// JSONからパース
let parsed: User = serde_json::from_str(&json).unwrap();
println!("{:?}", parsed);
}
HTTPクライアント: reqwest
[dependencies]
reqwest = { version = "0.11", features = ["json"] }
tokio = { version = "1", features = ["full"] }
use reqwest;
#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
let body = reqwest::get("https://httpbin.org/get")
.await?
.text()
.await?;
println!("{}", body);
Ok(())
}
非同期ランタイム: tokio
[dependencies]
tokio = { version = "1", features = ["full"] }
use tokio::time::{sleep, Duration};
#[tokio::main]
async fn main() {
println!("開始");
sleep(Duration::from_secs(1)).await;
println!("1秒後");
}
CLI引数パース: clap
[dependencies]
clap = { version = "4", features = ["derive"] }
use clap::Parser;
#[derive(Parser, Debug)]
#[command(name = "myapp")]
#[command(about = "サンプルアプリケーション")]
struct Args {
/// 名前
#[arg(short, long)]
name: String,
/// 回数
#[arg(short, long, default_value_t = 1)]
count: u8,
}
fn main() {
let args = Args::parse();
for _ in 0..args.count {
println!("Hello, {}!", args.name);
}
}
ログ: tracing
[dependencies]
tracing = "0.1"
tracing-subscriber = "0.3"
use tracing::{info, warn, error, debug};
use tracing_subscriber;
fn main() {
tracing_subscriber::fmt::init();
info!("アプリケーション開始");
debug!("デバッグ情報");
warn!("警告");
error!("エラー");
}
日時: chrono
[dependencies]
chrono = "0.4"
use chrono::{Local, Utc};
fn main() {
let now = Local::now();
println!("現在時刻: {}", now.format("%Y-%m-%d %H:%M:%S"));
let utc = Utc::now();
println!("UTC: {}", utc);
}
正規表現: regex
[dependencies]
regex = "1"
use regex::Regex;
fn main() {
let re = Regex::new(r"\d{3}-\d{4}").unwrap();
let text = "郵便番号: 123-4567";
if let Some(m) = re.find(text) {
println!("見つかりました: {}", m.as_str());
}
}
カテゴリ別おすすめクレート
Web開発
| クレート | 用途 |
|---|---|
| axum | Webフレームワーク |
| actix-web | 高性能Webフレームワーク |
| tower | ミドルウェア |
データベース
| クレート | 用途 |
|---|---|
| sqlx | 非同期SQL |
| diesel | ORM |
| sea-orm | 非同期ORM |
エラー処理
| クレート | 用途 |
|---|---|
| thiserror | カスタムエラー定義 |
| anyhow | 柔軟なエラー処理 |
テスト
| クレート | 用途 |
|---|---|
| mockall | モック |
| proptest | プロパティベーステスト |
まとめ
| カテゴリ | 推奨クレート |
|---|---|
| シリアライズ | serde + serde_json |
| HTTP | reqwest |
| 非同期 | tokio |
| CLI | clap |
| ログ | tracing |
| 日時 | chrono |
| 正規表現 | regex |
確認テスト
Q1. serdeの主な用途は?
正解: B) serdeは構造体などをJSON、YAML、TOMLなどの形式に変換(シリアライズ)したり、逆に変換(デシリアライズ)するためのクレートです。
Q2. tokioの役割は?
正解: B) tokioはRustの非同期処理を実行するためのランタイムです。`async/await`を使ったコードを実行するために必要です。
Q3. `#[derive(Serialize, Deserialize)]`を構造体に付けると何ができる?
正解: C) `Serialize`でJSON等への変換が可能になり、`Deserialize`でJSON等から構造体への復元が可能になります。
Q4. `#[derive(Serialize, Deserialize)]`を使うために必要なCargo.tomlの設定は?
正解: A) `#[derive(Serialize, Deserialize)]`を使うには`features = ["derive"]`が必要です。
Q5. chronoクレートで現在時刻を"2024-01-15 10:30:00"形式で表示するフォーマット文字列は?
正解: D) `%Y`は4桁年、`%m`は2桁月、`%d`は2桁日、`%H`は24時間制の時、`%M`は分、`%S`は秒を表します。
次のドキュメント: 03_testing.md