model_viewer: use premultiplied colors on clouds and atmospheric layers
[nit.git] / src / web / web_base.nit
index 60f7f2b..1daebdd 100644 (file)
@@ -21,12 +21,13 @@ import doc_down
 import popcorn
 import popcorn::pop_config
 import popcorn::pop_repos
+import popcorn::pop_json
 
 # Nitweb config file.
 class NitwebConfig
        super AppConfig
 
-       redef var default_db_name = "nitweb"
+       redef fun default_db_name do return "nitweb"
 
        # Model to use.
        var model: Model
@@ -102,29 +103,29 @@ redef class HttpResponse
        fun api_error(status: Int, message: String) do
                json(new APIError(status, message), status)
        end
+
+       # Write data as JSON and set the right content type header.
+       fun raw_json(json: nullable String, status: nullable Int) do
+               header["Content-Type"] = media_types["json"].as(not null)
+               if json == null then
+                       send(null, status)
+               else
+                       send(json, status)
+               end
+       end
 end
 
 # An error returned by the API.
 #
 # Can be serialized to json.
 class APIError
-       super Jsonable
+       serialize
 
        # Reponse status
        var status: Int
 
        # Response error message
        var message: String
-
-       # Json Object for this error
-       var json: JsonObject is lazy do
-               var obj = new JsonObject
-               obj["status"] = status
-               obj["message"] = message
-               return obj
-       end
-
-       redef fun serialize_to(v) do json.serialize_to(v)
 end
 
 # Fullname representation that can be used to build decorated links
@@ -146,7 +147,7 @@ end
 # * a `NSToken` for tokens like `::`, `>` and `$`
 # * a `MSRef` for references to mentities
 interface NSEntity
-       super Jsonable
+       super Serializable
 end
 
 # A reference to a MEntity that can be rendered as a link.
@@ -160,12 +161,10 @@ class NSRef
        # The mentity to link to/
        var mentity: MEntity
 
-       redef fun serialize_to(v) do
-               var obj = new JsonObject
-               obj["web_url"] = mentity.web_url
-               obj["api_url"] = mentity.api_url
-               obj["name"] = mentity.name
-               obj.serialize_to(v)
+       redef fun core_serialize_to(v) do
+               v.serialize_attribute("web_url", mentity.web_url)
+               v.serialize_attribute("api_url", mentity.api_url)
+               v.serialize_attribute("name", mentity.name)
        end
 end
 
@@ -184,17 +183,13 @@ redef class MEntity
        # URL to `self` within the JSON api.
        fun api_url: String do return "/api/entity/" / full_name
 
-       redef fun json do
-               var obj = super
-               obj["namespace"] = namespace
-               obj["web_url"] = web_url
-               obj["api_url"] = api_url
-               return obj
+       redef fun core_serialize_to(v) do
+               super
+               v.serialize_attribute("namespace", namespace)
+               v.serialize_attribute("web_url", web_url)
+               v.serialize_attribute("api_url", api_url)
        end
 
-       # Get the full json repesentation of `self` with MEntityRefs resolved.
-       fun api_json(handler: APIHandler): JsonObject do return full_json
-
        # Return `self.full_name` as an object that can be serialized to json.
        fun namespace: nullable Namespace do return null
 
@@ -203,47 +198,35 @@ redef class MEntity
 end
 
 redef class MEntityRef
-       redef fun json do
-               var obj = super
-               obj["namespace"] = mentity.namespace
-               obj["web_url"] = mentity.web_url
-               obj["api_url"] = mentity.api_url
-               obj["name"] = mentity.name
-               obj["mdoc"] = mentity.mdoc_or_fallback
-               obj["visibility"] = mentity.visibility
-               var modifiers = new JsonArray
-               for modifier in mentity.collect_modifiers do
-                       modifiers.add modifier
-               end
-               obj["modifiers"] = modifiers
+       redef fun core_serialize_to(v) do
+               super
+               v.serialize_attribute("namespace", mentity.namespace)
+               v.serialize_attribute("web_url", mentity.web_url)
+               v.serialize_attribute("api_url", mentity.api_url)
+               v.serialize_attribute("name", mentity.name)
+               v.serialize_attribute("mdoc", mentity.mdoc_or_fallback)
+               v.serialize_attribute("visibility", mentity.visibility.to_s)
+               v.serialize_attribute("modifiers", mentity.collect_modifiers)
                var mentity = self.mentity
                if mentity isa MMethod then
-                       obj["msignature"] = mentity.intro.msignature
+                       v.serialize_attribute("msignature", mentity.intro.msignature)
                else if mentity isa MMethodDef then
-                       obj["msignature"] = mentity.msignature
+                       v.serialize_attribute("msignature", mentity.msignature)
                else if mentity isa MVirtualTypeProp then
-                       obj["bound"] = to_mentity_ref(mentity.intro.bound)
+                       v.serialize_attribute("bound", to_mentity_ref(mentity.intro.bound))
                else if mentity isa MVirtualTypeDef then
-                       obj["bound"] = to_mentity_ref(mentity.bound)
+                       v.serialize_attribute("bound", to_mentity_ref(mentity.bound))
                end
-               return obj
-       end
-
-       redef fun full_json do
-               var obj = super
-               obj["location"] = mentity.location
-               return obj
+               v.serialize_attribute("location", mentity.location)
        end
 end
 
 redef class MDoc
 
        # Add doc down processing
-       redef fun json do
-               var obj = new JsonObject
-               obj["html_synopsis"] = html_synopsis.write_to_string
-               obj["html_documentation"] = html_documentation.write_to_string
-               return obj
+       redef fun core_serialize_to(v) do
+               v.serialize_attribute("html_synopsis", html_synopsis.write_to_string)
+               v.serialize_attribute("html_documentation", html_documentation.write_to_string)
        end
 end
 
@@ -295,6 +278,8 @@ redef class MClassDef
                end
                return new Namespace.from([mmodule.full_name, "$::", mclass.intro_mmodule.to_ns_ref: nullable NSEntity])
        end
+
+       redef fun web_url do return "{mclass.web_url}/lin#{full_name}"
 end
 
 redef class MProperty
@@ -334,6 +319,8 @@ redef class MPropDef
                end
                return res
        end
+
+       redef fun web_url do return "{mproperty.web_url}/lin#{full_name}"
 end
 
 redef class MClassType
@@ -353,18 +340,13 @@ redef class MVirtualType
 end
 
 redef class POSetElement[E]
-       super Jsonable
+       super Serializable
 
-       # Return JSON representation of `self`.
-       fun json: JsonObject do
+       redef fun serialize_to(v) do
                assert self isa POSetElement[MEntity]
-               var obj = new JsonObject
-               obj["greaters"] = to_mentity_refs(greaters)
-               obj["direct_greaters"] = to_mentity_refs(direct_greaters)
-               obj["direct_smallers"] = to_mentity_refs(direct_smallers)
-               obj["smallers"] = to_mentity_refs(smallers)
-               return obj
+               v.serialize_attribute("greaters", to_mentity_refs(greaters))
+               v.serialize_attribute("direct_greaters", to_mentity_refs(direct_greaters))
+               v.serialize_attribute("direct_smallers", to_mentity_refs(direct_smallers))
+               v.serialize_attribute("smallers", to_mentity_refs(smallers))
        end
-
-       redef fun serialize_to(v) do json.serialize_to(v)
 end