Wrote program for Day 20

This commit is contained in:
Mariano Riefolo 2024-08-14 15:58:02 +02:00
parent 4a71624acc
commit 8aa13b7c38
4 changed files with 79 additions and 1 deletions

View File

@ -66,7 +66,7 @@ We encourage you to share your progress and ask questions in the Discussions sec
| Day #17 | [Prison Break](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-03/Day-17_Prison-Break) | :white_check_mark: |
| Day #18 | [Unique Paths](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-03/Day-18_Unique-Paths) | :white_check_mark: |
| Day #19 | [URL Shortener](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-03/Day-19_URL-Shortener) | :white_check_mark: |
| Day #20 | [API Challenge](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-03/Day-20_API-Challenge) | :white_large_square: |
| Day #20 | [API Challenge](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-03/Day-20_API-Challenge) | :white_check_mark: |
| Day #21 | [Random Maze Generator](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-03/Day-21_Random-Maze-Generator) | :white_large_square: |
| Day #22 | [Marcio Mellos Challenge](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-04/Day-22_Marcio-Mellos-Challenge) | :white_large_square: |
| Day #23 | [The Dining Philosophers](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-04/Day-23_The-Dining_Philosophers) | :white_large_square: |

View File

@ -0,0 +1,11 @@
[package]
name = "day20"
version = "0.1.0"
edition = "2021"
[dependencies]
axum = "0.7.5"
reqwest = "0.12.5"
serde = { version = "1.0.207", features = ["derive"] }
serde_json = "1.0.124"
tokio = { version = "1.39.2", features = ["full"] }

View File

@ -0,0 +1,56 @@
use axum::{extract::Query, Json};
use reqwest::Response;
use serde::Deserialize;
use serde_json::{from_str, json, Value};
use std::collections::HashMap;
pub async fn search(params: Params) -> Result<Response, reqwest::Error> {
let client = reqwest::Client::builder()
.user_agent("JustLearningRust/1.0")
.build()?;
let mut query = String::new();
if let Some(q) = params.q {
query.push_str(&format!("&q={}", q));
}
if let Some(latitude) = params.latitude {
query.push_str(&format!("&lat={}", latitude));
}
if let Some(longitude) = params.longitude {
query.push_str(&format!("&lon={}", longitude));
}
let url = format!(
"https://nominatim.openstreetmap.org/search?format=json{}",
query
);
let res = client.get(url).send().await?;
Ok(res)
}
#[derive(Deserialize)]
pub struct Params {
q: Option<String>,
latitude: Option<f32>,
longitude: Option<f32>,
}
pub async fn search_handler(Query(params): Query<Params>) -> Json<Value> {
let res = search(params).await.expect("Failed to get response body");
let str = &res.text().await.expect("Failed to get response body");
let json: Vec<HashMap<String, Value>> = from_str(str).unwrap();
let mut ret = Vec::new();
for el in json.iter() {
let display_name = el.get("display_name").unwrap().as_str().unwrap();
if display_name.contains("United States")
|| display_name.contains("Canada")
|| display_name.contains("Brasil")
// there's no way to filter by population
{
ret.push(json!({"name": el.get("display_name"), "latitude": el.get("lat"), "longitude": el.get("lon"), "score": el.get("importance")}));
}
}
Json(json!({ "suggestions": ret }))
}

View File

@ -0,0 +1,11 @@
use axum::routing::{get, Router};
use day20::search_handler;
#[tokio::main]
async fn main() {
let app = Router::new().route("/suggestions", get(search_handler));
let listener = tokio::net::TcpListener::bind(&"0.0.0.0:3000")
.await
.unwrap();
axum::serve(listener, app).await.unwrap();
}