//
// Copyright (c) 2008, Brian Frank and Andy Frank
// Licensed under the Academic Free License version 3.0
//
// History:
//   27 Nov 08  Brian Frank  Creation
//

using web

**
** RouteMod routes a level of the URI path to sub-WebMods.
**
** See [pod doc]`pod-doc#route`
**
const class RouteMod : WebMod
{
  **
  ** Constructor with it-block.
  **
  new make(|This|? f)
  {
    f?.call(this)
    if (routes.isEmpty) throw ArgErr("RouteMod.routes is empty")
  }

  **
  ** Map of URI path names to sub-WebMods.  The name "index"
  ** is used for requests to the RouteMod itself.
  **
  const [Str:WebMod] routes := Str:WebMod[:]

  override Void onService()
  {
    // get the next name in the path
    name := req.modRel.path.first

    // lookup route, if not found this is 404
    route := routes[name ?: "index"]
    if (route == null) { res.sendErr(404); return }

    // dive into sub-WebMod
    req.mod = route
    if (name != null) req.modBase = req.modBase + `$name/`
    route.onService
  }

  **
  ** Call 'onStart' on sub-mods.
  **
  override Void onStart() { routes.each |mod| { mod.onStart } }

  **
  ** Call 'onStop' on sub-mods.
  **
  override Void onStop() { routes.each |mod| { mod.onStop } }

}