注意

これは書き散らしなので案外すぐにこの記事は使い物にならなくなります。多分。

TL;DR

    • 結局ドキュメントのdocs.rsでお出しされていないコードは参考にしてはならない

 

    何が変更された追跡してそこだけ現行版にあわせたら別に問題ない話→なのでやっぱりドキュメントが正義

axumのexampleとは

The axum repo contains a number of examples that show how to put all the pieces together.

axum -Rustより

ここのa number of examplesからGitHubのコードに飛ぶことができ、WebSocketだったりデータベースコネクションだったりいろんなコードの実装例が書かれている素敵なリンクです。

実際にコードを動かしてみる

脳死でコピペして動かしてみましょう 今回はhello-worldを使っています

#...
[dependencies]
axum = "0.6.18"
tokio = { version = "1.15.0", features = ["full"] }
//! Run with
//!
//! ```not_rust
//! cargo run -p example-hello-world
//! ```

use axum::{response::Html, routing::get, Router};

#[tokio::main]
async fn main() {
    // build our application with a route
    let app = Router::new().route("/", get(handler));

    // run it
    let listener = tokio::net::TcpListener::bind("127.0.0.1:3000")
        .await
        .unwrap();
    println!("listening on {}", listener.local_addr().unwrap());
    axum::serve(listener, app).await.unwrap();
}

async fn handler() -> Html<&'static str> {
    Html("<h1>Hello, World!</h1>")
}

実行結果がこちら

dev\rust-play on  main [?] is  v0.1.0 via  v1.68.2
❯ cargo run
   Compiling rust-play v0.1.0 (C:\Users\raiga\dev\rust-play)
error[E0425]: cannot find function `serve` in crate `axum`
  --> src\main.rs:13:11
   |
13 |     axum::serve(listener, app).await.unwrap();
   |           ^^^^^ not found in `axum`

For more information about this error, try `rustc --explain E0425`.
error: could not compile `rust-play` due to previous error

というように、存在しないよ~という風に言われます。

Exampleなのになぜ動かないのか

そんなのExampleの意味ないじゃないか!って思ったりもしますが、おちついて色々調べてみる

axumのバージョンは0.6.18

最新の0.6.18のドキュメントにはまずaxum::serveの項目はない

というわけでまぁあたりまえの話なんですけど、「そのバージョンにそんな機能はないよ!」という話でした

そしてGitHubの最終のファイルのコミットを追ってみると、あるPRのコミットにより現行のバージョンにない機能を使っているようです。

 

このPRを見る限り、新しいv0.7への機能改善だと思われるのですが、何故かマージしている先のブランチが404なので、これの機能が結局次のリリースなどで実装されるのかは不明なのに、そのままにされているみたい・・・・・・?

結局どうするのか

今回注目した部分での改変は現行版が

    let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
    axum::Server::bind(&addr)
        .serve(app.into_make_service())
        .await
        .unwrap();

    let listener = tokio::net::TcpListener::bind("127.0.0.1:3000")
        .await
        .unwrap();
    axum::serve(listener, app).await.unwrap();

と変更されているようなので、そこは変更すればいいでしょう。
まだ全部のExampleを見ていないので、もしかしたらまだ他にも実装が宙ぶらりんでエラーになる機能もあるかもしれないので、他のところも一度実装例をそのまま動かしてみて、そこから動く部分を参考にするようにすればいいと思います。

なのでまずはきちんとドキュメント、読もう!

追記 ブランチ選択

今自分の使いたいバージョンに合わせてブランチを切り替えればその時のバージョンの使用例にできます(でもドキュメントのリンクもできればバージョンにあわせてほしいよなーなんて思っていません)

 

广告
将在 10 秒后关闭
bannerAds