Merge: Less fixme and todo
[nit.git] / lib / serialization.nit
index cd80d3d..8a1d1ee 100644 (file)
@@ -15,7 +15,9 @@
 # limitations under the License.
 
 # Offers services to serialize a Nit objects to different persistent formats
-module serialization
+module serialization is
+       new_annotation auto_serializable
+end
 
 # Abstract serialization service to be sub-classed by specialized services.
 interface Serializer
@@ -28,13 +30,20 @@ interface Serializer
        # Serialize an attribute, used by `Serializable::core_serialize_to`
        fun serialize_attribute(name: String, value: nullable Object)
        do
+               if not try_to_serialize(value) then
+                       warn("argument {value.class_name}::{name} is not serializable.")
+               end
+       end
+
+       # Serialize `value` is possie, i.e. it is `Serializable` or `null`
+       fun try_to_serialize(value: nullable Object): Bool
+       do
                if value isa Serializable then
                        value.serialize_to_or_delay(self)
                else if value == null then
                        serialize value
-               else
-                       warn("argument {value.class_name}::{name} is not serializable.")
-               end
+               else return false
+               return true
        end
 
        # Warn of problems and potential errors (such as if an attribute
@@ -42,6 +51,28 @@ interface Serializer
        fun warn(msg: String) do print "Serialization warning: {msg}"
 end
 
+# Abstract deserialization service
+#
+# After initialization of one of its sub-classes, call `deserialize`
+interface Deserializer
+       # Main method of this class, returns a Nit object
+       fun deserialize: nullable Object is abstract
+
+       # Internal method to be implemented by sub-classes
+       fun deserialize_attribute(name: String): nullable Object is abstract
+
+       # Internal method called by objects in creation,
+       # to be implemented by sub-classes
+       fun notify_of_creation(new_object: Object) is abstract
+
+       # Mainly generated method to return the next instance of the givent
+       # class by name
+       fun deserialize_class(class_name: String): Object do
+               print "Error: doesn't know how to deserialize class \"{class_name}\""
+               abort
+       end
+end
+
 # Instances of this class can be passed to `Serializer::serialize`
 interface Serializable
        # Full or true serialization
@@ -69,3 +100,4 @@ redef class Int super DirectSerializable end
 redef class Float super DirectSerializable end
 redef class NativeString super DirectSerializable end
 redef class String super DirectSerializable end
+redef class Array[E] super Serializable end