geometry: move up custom `to_s` to the interfaces
[nit.git] / lib / popcorn / pop_handlers.nit
index 1a22db6..6b1e825 100644 (file)
@@ -18,7 +18,9 @@
 module pop_handlers
 
 import pop_routes
+import json::static
 import json
+import csv
 
 # Class handler for a route.
 #
@@ -449,7 +451,7 @@ redef class HttpResponse
        end
 
        # Write data as JSON and set the right content type header.
-       fun json(json: nullable Jsonable, status: nullable Int) do
+       fun json(json: nullable Serializable, status: nullable Int) do
                header["Content-Type"] = media_types["json"].as(not null)
                if json == null then
                        send(null, status)
@@ -458,18 +460,36 @@ redef class HttpResponse
                end
        end
 
-       # Write error as JSON and set the right content type header.
-       fun json_error(error: nullable Jsonable, status: nullable Int) do
-               json(error, status)
+       # Write data as CSV and set the right content type header.
+       fun csv(csv: nullable CsvDocument, status: nullable Int) do
+               header["Content-Type"] = media_types["csv"].as(not null)
+               if csv == null then
+                       send(null, status)
+               else
+                       send(csv.write_to_string, status)
+               end
+       end
+
+       # Write error as JSON.
+       #
+       # Format: `{"message": message, "status": status}`
+       fun json_error(message: String, status: Int) do
+               var obj = new JsonObject
+               obj["status"] = status
+               obj["message"] = message
+               json(obj, status)
        end
 
        # Redirect response to `location`
+       #
+       # Use by default 303 See Other as it is the RFC
+       # way to redirect web applications to a new URI.
        fun redirect(location: String, status: nullable Int) do
                header["Location"] = location
                if status != null then
                        status_code = status
                else
-                       status_code = 302
+                       status_code = 303
                end
                check_sent
                sent = true