///|
async fn main {
  let app = @crescent.App()

  // Register global middleware
  app
  ..use_middleware(logger_middleware())
  ..use_middleware(@cors.handle_cors())
  ..use_middleware(@middleware.security_headers())

  // Text Response
  ..get("/", _ => "Tadaa!")

  // Hello World
  ..on("GET", "/hello", _ => "Hello world!")
  ..group("/api", group => {
    // Add group-level middleware
    group.use_middleware((event, next) => {
      println("API Group Middleware: \{event.req.http_method} \{event.req.url}")
      next()
    })
    group.get("/hello", _ => "Hello world!")
    group.get("/json", _ => {
      @crescent.HttpResponse::ok().json_value(
        ({ "name": "John Doe", "age": 30, "city": "New York" } : Json),
      )
    })
  })

  // JSON Response
  ..get("/json", _ => {
    ({ "name": "John Doe", "age": 30, "city": "New York" } : Json)
  })

  // Async Response
  ..get_raw("/async_data", _ => {
    ({ "name": "John Doe", "age": 30, "city": "New York" } : Json)
  })

  // Dynamic Routes
  // /hello2/World = Hello, World!
  ..get("/hello/:name", event => {
    let name = event.param("name").unwrap_or("World")
    "Hello, \{name}!"
  })
  // /hello2/World = Hello, World!
  ..get("/hello2/*", event => {
    let name = event.param("_").unwrap_or("World")
    "Hello, \{name}!"
  })

  // Wildcard Routes
  // /hello3/World/World = Hello, World/World!
  ..get("/hello3/**", event => {
    let name = event.param("_").unwrap_or("World")
    "Hello, \{name}!"
  })

  // Echo Server
  .post("/echo", e => e.req)

  // Custom 404 handler
  app.set_not_found_handler(_ => {
    @crescent.HttpResponse::not_found().body(
      @crescent.html(
        (
          #|
          #|
          #|  

Custom 404

#| #| ), ), ) }) // Print Server URL for path in app.routes() { println("\{path.0} http://localhost:4000\{path.1}") } // Serve app.serve(port=4000) catch { err => println("Server error: \{err}") } } ///| fn logger_middleware() -> @crescent.Middleware { (event, next) => { let start_time = @async.now() let res = next() let duration = @async.now() - start_time println("\{event.req.http_method} \{event.req.url} - \{duration}ms") res } }