#' Router
#'
#' Web server.
#'
#' @field error 500 response when the route errors, must a handler function that accepts the request and the response, by default uses [response_500()].
#'
#' @examples
#' # log
#' logger <- new_log()
#' # router
#' # create router
#' router <- Router$new("/users")
#'
#' router$get("/", function(req, res){
#'  res$send("List of users")
#' })
#'
#' router$get("/:id", function(req, res){
#'  logger$log("Return user id:", req$params$id)
#'  res$send(req$params$id)
#' })
#'
#' router$get("/:id/profile", function(req, res){
#'  msg <- sprintf("This is the profile of user #%s", req$params$id)
#'  res$send(msg)
#' })
#'
#' # core app
#' app <- Ambiorix$new()
#'
#' app$get("/", function(req, res){
#'  res$send("Home!")
#' })
#'
#' # mount the router
#' app$use(router)
#'
#' if(interactive())
#'  app$start()
#'
#' @importFrom assertthat assert_that
#' @importFrom utils browseURL
#'
#' @return A Router object.
#' @export
Router <- R6::R6Class(
  "Router",
  inherit = Routing,
  public = list(
    error = NULL,
    #' @details Define the base route.
    #' @param path The base path of the router.
    initialize = function(path) {
      assert_that(not_missing(path))
      super$initialize(path)
    },
    #' @details Print
    print = function() {
      cli::cli_rule("Ambiorix", right = "router")
      cli::cli_li("routes: {.val {super$n_routes()}}")
    }
  )
)
