/// `PokemonResponse`は、PokeAPIからの応答を表す構造体#[derive(Deserialize, Debug)]structPokemonResponse {
name: String,
}
#[tokio::main]
async fnmain() {
let start =std::time::Instant::now();
let client =reqwest::Client::new();
letmut handles =vec![];
for number in1..=150 {
let client = client.clone();
handles.push(tokio::spawn(
async move { fetch_pokemon(&client, number).await },
));
}
letmut pokemons =Vec::new();
for handle in handles {
match handle.await {
Ok(Ok(pokemon)) => pokemons.push(pokemon.name),
Ok(Err(e)) =>eprintln!("Error: {}", e),
Err(e) =>eprintln!("Error: {:?}", e),
}
}
println!("{:?}", pokemons);
println!("Time: {:?}", start.elapsed());
}
/// fetchPokemon は指定された番号のポケモンの名前を取得
async fnfetch_pokemon(client: &reqwest::Client, number: u32) ->Result<PokemonResponse, reqwest::Error> {
let url =format!("https://pokeapi.co/api/v2/pokemon/{}", number);
let resp = client.get(&url).send().await?;
let pokemon = resp.json::<PokemonResponse>().await?;
Ok(pokemon)
}
Cargo.tomlは以下の通りです。
[package]
name = "poke"
version = "0.1.0"
edition = "2021"
[dependencies]
reqwest = { version = "0.11.22", features = ["json"] }
tokio = { version = "1", features = ["full"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
Rust 実行結果
それぞれ実行してみます。
$ cargo run --release
❯ cargo run --release
Finished release [optimized] target(s)in0.16s
Running `target/release/poke`["bulbasaur", "ivysaur", ...
Time: 1.5475795s
Euro Pythonの開催地であったチェコ・プラハは観光地であることもあり、チェコ語ももちろん町中にありましたが、英語も同じくらいあります。また、若い人を中心に英語をしゃべることができます。チェコ語しかしゃべれないスーパーの店員さんともGoogle翻訳で難なくコミュニケーションをとることができました。