typestar

JSON de entrada y de salida en Rust

Json es extractor y respuesta a la vez, impulsado por serde sobre tus tipos.

use axum::{routing::post, Json, Router};
use serde::{Deserialize, Serialize};

#[derive(Deserialize)]
struct RunInput {
    lang: String,
    tpm: u32,
}

#[derive(Serialize)]
struct RunSaved {
    stars: u8,
    lang: String,
}

async fn save(Json(input): Json<RunInput>) -> Json<RunSaved> {
    let stars = if input.tpm >= 100 { 3 } else { 1 };
    Json(RunSaved { stars, lang: input.lang })
}

#[tokio::main]
async fn main() {
    let app = Router::new().route("/api/results", post(save));
    let listener = tokio::net::TcpListener::bind("127.0.0.1:8080")
        .await
        .unwrap();
    axum::serve(listener, app).await.unwrap();
}

Cómo funciona

  1. Json<T> como argumento deserializa el cuerpo de la petición.
  2. Json<T> en la posición de retorno serializa la respuesta.
  3. Un cuerpo inválido se vuelve un 422 antes de que tu handler corra.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
28
Caracteres a escribir
590
Tokens
174
Ritmo de tres estrellas
105 tpm

Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 99 segundos.

Escribe este fragmento

Paso 2 de 3 en Rutas y handlers; paso 2 de 9 en Servicios web con axum.

← Anterior Siguiente →