diff --git a/Cargo.lock b/Cargo.lock index 2c3b7d5..8ee425f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -260,6 +260,8 @@ name = "cch23-8bit" version = "0.1.0" dependencies = [ "axum 0.7.1", + "serde", + "serde_json", "shuttle-axum", "shuttle-runtime", "tokio", diff --git a/Cargo.toml b/Cargo.toml index 94be6ed..9196f30 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,8 @@ edition = "2021" [dependencies] axum = "0.7.1" +serde = { version = "1.0.193", features = ["derive"] } +serde_json = "1.0.108" shuttle-axum = { version = "0.34.1", default-features = false, features = ["axum-0-7"] } shuttle-runtime = "0.34.1" tokio = "1.34.0" diff --git a/src/cal/day04.rs b/src/cal/day04.rs new file mode 100644 index 0000000..e8523cc --- /dev/null +++ b/src/cal/day04.rs @@ -0,0 +1,71 @@ +use axum::{extract::Json, response::IntoResponse, routing::post, Router}; + +pub(crate) fn router() -> Router { + Router::new() + .route("/4/strength", post(strength)) + .route("/4/contest", post(contest)) +} + +#[allow(dead_code)] +#[derive(serde::Deserialize)] +struct Reindeer { + name: String, + strength: i32, +} + +async fn strength(Json(reindeer): Json>) -> impl IntoResponse { + reindeer + .into_iter() + .map(|r| r.strength) + .sum::() + .to_string() +} + +#[derive(serde::Deserialize)] +struct AdvReindeer { + name: String, + strength: i32, + speed: f32, + height: i32, + antler_width: i32, + snow_magic_power: i32, + favorite_food: String, + #[serde(rename = "cAnD13s_3ATeN-yesT3rdAy")] + candies: i32, +} + +#[derive(serde::Serialize)] +struct ContestResult { + fastest: String, + tallest: String, + magician: String, + consumer: String, +} + +async fn contest(Json(reindeer): Json>) -> Json { + let fastest = reindeer + .iter() + .max_by(|l, r| l.speed.total_cmp(&r.speed)) + .unwrap(); + let tallest = reindeer.iter().max_by_key(|r| r.height).unwrap(); + let magician = reindeer.iter().max_by_key(|r| r.snow_magic_power).unwrap(); + let consumer = reindeer.iter().max_by_key(|r| r.candies).unwrap(); + Json(ContestResult { + fastest: format!( + "Speeding past the finish line with a strength of {} is {}", + fastest.strength, fastest.name + ), + tallest: format!( + "{} is standing tall with his {} cm wide antlers", + tallest.name, tallest.antler_width + ), + magician: format!( + "{} could blast you away with a snow magic power of {}", + magician.name, magician.snow_magic_power + ), + consumer: format!( + "{} ate lots of candies, but also some {}", + consumer.name, consumer.favorite_food + ), + }) +} diff --git a/src/cal/mod.rs b/src/cal/mod.rs index 3384629..52a3bd8 100644 --- a/src/cal/mod.rs +++ b/src/cal/mod.rs @@ -1,8 +1,10 @@ mod day00; mod day01; +mod day04; pub(crate) fn router() -> axum::Router { axum::Router::new() .nest("/", day00::router()) .nest("/", day01::router()) + .nest("/", day04::router()) }