ファイル分割に悩んだ・・・
きれいにコードを書くためにファイル分割をしてモジュールとして使いたいって場面、どの言語でも多いですよね。
RustでAPIを作ってみようと思って膨らむからファイル分割をしようとしたんだけど、やり方が分からなかった
やりたい事としては以下のディレクトリ構成でAPIのグループごとに分けたかったということです。
.
└── project/
├── src/
│ ├── main.rs
│ └── api/
│ ├── hoge_api.rs
│ └── fuga_api.rs
├── Cargo.toml
├── Cargo.lock
└── target
とりあえずggrksということで調べてみました。
・・・わからん!
なので、いろいろ試行錯誤することに
解決方法
ディレクトリ
.
└── project/
├── src/
│ ├── main.rs
│ └── api/
│ ├── mod.rs
│ ├── hoge_api.rs
│ └── fuga_api.rs
├── Cargo.toml
├── Cargo.lock
└── target
結果
結論からいうと、分割したファイルを配置したいディレクトリにmod.rsを置いてこれを記述する
src/api/mod.rs
pub mod hoge_api;
pub mod fuga_api;
そして、main.rs(一番上のモジュール使うファイル)に以下を追記する
src/main.rs
use axum::{
routing::get,
Router,
body::Body
};
use std::net::SocketAddr;
use std::env;
use dotenv::dotenv;
mod api;
#[tokio::main]
async fn main() {
// .envファイルから環境変数を読み出し
dotenv().ok();
// logを出力するシステム
let log_level = env::var("RUST_LOG").unwrap_or("info".to_string());
env::set_var("RUST_LOG", log_level);
tracing_subscriber::fmt::init();
// APIの作成
let app:Router<Body> = create_app();
// ソケットの確保
let addr = SocketAddr::from(([127, 0, 0, 1], 8000));
// デバッグ用の接続先を表示
tracing::debug!("listening on http://{}", addr);
// リスニング
axum::Server::bind(&addr)
.serve(app.into_make_service())
.await
.unwrap();
}
// APIを作成する関数
fn create_app() -> Router {
Router::new()
.route("/", get(root))
// hoge_apiのapiを作成
.nest("/hoge", api::hoge_api::create_router())
// fuga_apiのapiを作成
.nest("/fuga", api::fuga_api::create_router())
}
async fn root() -> &'static str {
"Hello, World!"
}
まとめ
これでファイル分割完了!
いろいろ調べたけど割と自分のやりたいことと少々違って、結構手探りでやってみたけど、きれいにまとまって満足