SakiKawasaki 5 سال پیش
والد
کامیت
e5fdb8e461
3فایلهای تغییر یافته به همراه55 افزوده شده و 23 حذف شده
  1. 54 22
      akane/akane.nim
  2. BIN
      tests/test3/main.exe
  3. 1 1
      tests/test3/main.nim

+ 54 - 22
akane/akane.nim

@@ -44,6 +44,10 @@ proc newServer*(address: string = "127.0.0.1",
 
 
 proc loadtemplate*(name: string): Future[string] {.async, inline.} =
+  ## Loads HTML template from `templates` folder.
+  ##
+  ## Arguments:
+  ## -   ``name`` - template's name, e.g. "index", "api", etc.
   var
     file = openAsync(("templates" / name) & ".html")
     readed = await file.readAll()
@@ -63,23 +67,17 @@ proc parseQuery*(request: Request): Future[JsonNode] {.async.} =
       result[decodeUrl(timed[0])] = %decodeUrl(timed[1])
 
 
-macro answer*(request, message: untyped): untyped =
-  ## Responds from server with utf-8.
-  result = newCall(
-    "respond",
-    request,
-    ident("Http200"),
-    newCall(
-      "&",
-      newLit("<head><meta charset='utf-8'></head>"),
-      message
-    )
-  )
-
-
 macro pages*(server: ServerRef, body: untyped): untyped =
   ## This macro provides convenient page adding.
   ##
+  ## `body` should be StmtList.
+  ## page type can be:
+  ## -   ``equals``
+  ## -   ``startswith``
+  ## -   ``endswith``
+  ## -   ``regex``
+  ## -   ``notfound`` - this page uses without URL argument.
+  ##
   ## ..code-block::Nim
   ##  server.pages:
   ##    equals("/home"):
@@ -88,8 +86,8 @@ macro pages*(server: ServerRef, body: untyped): untyped =
   var
     stmtlist = newStmtList()
     notfound_declaration = false
-  stmtlist.add(  # let urlParams: JsonNode = await parseQuery(request)
-    newNimNode(nnkLetSection).add(
+  stmtlist.add(
+    newNimNode(nnkLetSection).add(  # let urlParams: JsonNode = await parseQuery(request)
       newNimNode(nnkIdentDefs).add(
         ident("urlParams"),
         ident("JsonNode"),
@@ -102,7 +100,7 @@ macro pages*(server: ServerRef, body: untyped): untyped =
         )
       )
     ),
-    newNimNode(nnkLetSection).add(
+    newNimNode(nnkLetSection).add(  # let decode_url: string = decodeUrl(request.url.path)
       newNimNode(nnkIdentDefs).add(
         ident("decoded_url"),
         ident("string"),
@@ -143,7 +141,7 @@ macro pages*(server: ServerRef, body: untyped): untyped =
             newCall("==", path, ident("decoded_url")),
             slist))
       elif current == "startswith":
-        slist.insert(0,
+        slist.insert(0,  # let url = decoded_url[`path`.len..^1]
           newNimNode(nnkLetSection).add(
             newNimNode(nnkIdentDefs).add(
               ident("url"),
@@ -167,7 +165,7 @@ macro pages*(server: ServerRef, body: untyped): untyped =
               path),
             slist))
       elif current == "endswith":
-        slist.insert(0,
+        slist.insert(0,  # let url: string = decoded_url[0..^`path`.len]
           newNimNode(nnkLetSection).add(
             newNimNode(nnkIdentDefs).add(
               ident("url"),
@@ -192,12 +190,12 @@ macro pages*(server: ServerRef, body: untyped): untyped =
               path),
             slist))
       elif current == "regex":
-        slist.insert(0,
+        slist.insert(0,  # discard match(decoded_url, `path`, url)
             newNimNode(nnkDiscardStmt).add(
               newCall("match", ident("decoded_url"), path, ident("url"))
             )
           )
-        slist.insert(0,
+        slist.insert(0,  # var url: array[20, string]
           newNimNode(nnkVarSection).add(
             newNimNode(nnkIdentDefs).add(
               ident("url"),
@@ -223,7 +221,7 @@ macro pages*(server: ServerRef, body: untyped): untyped =
   if not notfound_declaration:
     stmtlist[2].add(
       newNimNode(nnkElse).add(
-        newCall(
+        newCall(  # await request.respond(Http404, "Not found")
           "await",
           newCall(
             "respond",
@@ -256,6 +254,40 @@ macro pages*(server: ServerRef, body: untyped): untyped =
     stmtlist)
 
 
+macro answer*(request, message: untyped): untyped =
+  ## Responds from server with utf-8.
+  ##
+  ## Translates to:
+  ##   await request.respond(Http200, "<head><meta charset='utf-8'></head>" & message)
+  result = newCall(
+    "respond",
+    request,
+    ident("Http200"),
+    newCall(
+      "&",
+      newLit("<head><meta charset='utf-8'></head>"),
+      message
+    )
+  )
+
+
+macro error*(request, message: untyped): untyped =
+  ## Responds from server with utf-8.
+  ##
+  ## Translates to:
+  ##   await request.respond(Http404, "<head><meta charset='utf-8'></head>" & message)
+  result = newCall(
+    "respond",
+    request,
+    ident("Http404"),
+    newCall(
+      "&",
+      newLit("<head><meta charset='utf-8'></head>"),
+      message
+    )
+  )
+
+
 macro start*(server: ServerRef): untyped =
   ## Starts server.
   result = quote do:

BIN
tests/test3/main.exe


+ 1 - 1
tests/test3/main.nim

@@ -15,7 +15,7 @@ server.pages:
   regex(re"\A\/id(\d+)\z"):  # when url is re"domain/id\d+", try "domain/id123" and "domain/idNotNumber"
     await request.answer("Hello, user with ID" & url[0])  # url var contains array[20, string], matched from URL.
   notfound:  # `notfound` should be at the end of the remaining cases
-    await request.answer("<h1 align='center'>Sorry, but page not found :(</h1>")
+    await request.error("<h1 align='center'>Sorry, but page not found :(</h1>")  # `error` sends Http404 code.
 
 
 server.start()  # Starts server.