Skip to content

Commit

Permalink
feat: add main.rs
Browse files Browse the repository at this point in the history
  • Loading branch information
kenken714 committed Nov 11, 2024
1 parent a507eea commit a4f6c82
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 46 deletions.
24 changes: 9 additions & 15 deletions docs/chapter2/section4/1_image.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,36 +4,30 @@

### コードを書く

`naro_server`というディレクトリを作り、その中でコードを書いてください。第 1 部でやったように、 Go を使って下の条件を満たすサーバーアプリケーションを作ってください。
`naro_server`というディレクトリを作り、その中でコードを書いてください。第 1 部でやったように、 Rust を使って下の条件を満たすサーバーアプリケーションを作ってください。

- `/greeting`への GET リクエストに、環境変数 `GREETING_MESSAGE`の値を返す。
- 起動するポートを環境変数`PORT`で指定できる。

`go mod`コマンドで外部ライブラリを管理しましょう。

https://go.dev/ref/mod

```sh
go mod init naro_server
go mod tidy
```

:::details 答え
<<< @/chapter2/section4/src/main.go
<<< @/chapter2/section4/src/main.rs

`axum``tokio` の依存関係を追加する必要があります。
:::

### ビルドして実行する

今までは`go run`コマンドでプログラムを実行していましたが、Go では`go build`コマンドでコンパイルして実行ファイルを生成し、そのファイルを用いてプログラムを実行できます。
今までは`cargo run`コマンドでプログラムを実行していましたが、Rust では`cargo build`コマンドでコンパイルして実行ファイルを生成し、そのファイルを用いてプログラムを実行できます。

```sh
go build -o server
cargo build --release
```

上のコマンドを実行すると`server`というファイルが生成され、`./server`で実行できます
`--release`オプションをつけることで、最適化されたバイナリが生成されます

以下のコマンドで実行できます。
```sh
GREETING_MESSAGE="こんにちは" PORT="8080" ./server
GREETING_MESSAGE="こんにちは" PORT="8080" ./target/release/naro-server
```

実行前に環境変数を設定しています。
Expand Down
31 changes: 0 additions & 31 deletions docs/chapter2/section4/src/main.go

This file was deleted.

25 changes: 25 additions & 0 deletions docs/chapter2/section4/src/main.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
use axum::{http::StatusCode, routing::get, Router};

#[tokio::main]
async fn main() {
let port = std::env::var("PORT")
.expect("failed to get env PORT")
.parse::<u16>()
.expect("failed to parse PORT");

let app = Router::new().route("/greeting", get(greeting_handler));

let addr = std::net::SocketAddr::from(([127, 0, 0, 1], port));

let listener = tokio::net::TcpListener::bind(&addr).await.unwrap();

println!("Listening on {}", addr);

axum::serve(listener, app).await.unwrap();
}

async fn greeting_handler() -> Result<(StatusCode, String), StatusCode> {
let greeting =
std::env::var("GREETING_MESSAGE").map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
Ok((StatusCode::OK, greeting))
}

0 comments on commit a4f6c82

Please sign in to comment.