branch: main
lib.rs
921 bytesRaw
use worker::{event, Context, Env, Fetch, Request, Response, Result, RouteContext, Router, Url};

const POKEMON_API_URL: &str = "https://pokeapi.co/api/v2/pokemon";

/// Fetches Pokémon data from the PokeAPI given a full URL.
async fn fetch_pokemon(url_string: &str) -> Result<Response> {
    // construct a new Url
    let url = Url::parse(url_string)?;
    Fetch::Url(url).send().await
}

/// Route handler for GET /pokemon/:name
async fn get_pokemon(_: Request, ctx: RouteContext<()>) -> Result<Response> {
    let name = ctx
        .param("name")
        .ok_or_else(|| worker::Error::RustError("Missing 'name' param".into()))?;
    let url = format!("{POKEMON_API_URL}/{name}");
    fetch_pokemon(&url).await
}

#[event(fetch)]
pub async fn main(req: Request, env: Env, _ctx: Context) -> Result<Response> {
    Router::new()
        .get_async("/pokemon/:name", get_pokemon)
        .run(req, env)
        .await
}