code: def compile_path(
      path: str
  ) -> typing.Tuple[typing.Pattern, str, typing.Dict[str, Convertor]]:
      
      path_regex = "^"
      path_format = ""
  
      idx = 0
      param_convertors = {}
      for match in PARAM_REGEX.finditer(path):
          param_name, convertor_type = match.groups("str")
          convertor_type = convertor_type.lstrip(":")
          assert (
              convertor_type in CONVERTOR_TYPES
          ), f"Unknown path convertor '{convertor_type}'"
          convertor = CONVERTOR_TYPES[convertor_type]
  
          path_regex += path[idx : match.start()]
          path_regex += f"(?P<{param_name}>{convertor.regex})"
  
          path_format += path[idx : match.start()]
          path_format += "{%s}" % param_name
  
          param_convertors[param_name] = convertor
  
          idx = match.end()
  
      path_regex += path[idx:] + "$"
      path_format += path[idx:]
  
      return re.compile(path_regex), path_format, param_convertors
docs: Given a path string, like: "/{username:str}", return a three-tuple
      of (regex, format, {param_name:convertor}).
  
      regex:      "/(?P<username>[^/]+)"
      format:     "/{username}"
      convertors: {"username": StringConvertor()}