lib: intro the abstract serialization module
authorAlexis Laferrière <alexis.laf@xymus.net>
Sat, 1 Feb 2014 18:49:13 +0000 (13:49 -0500)
committerAlexis Laferrière <alexis.laf@xymus.net>
Fri, 7 Feb 2014 19:44:41 +0000 (14:44 -0500)
Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

lib/serialization.nit [new file with mode: 0644]

diff --git a/lib/serialization.nit b/lib/serialization.nit
new file mode 100644 (file)
index 0000000..cd80d3d
--- /dev/null
@@ -0,0 +1,71 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2014 Alexis Laferrière <alexis.laf@xymus.net>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Offers services to serialize a Nit objects to different persistent formats
+module serialization
+
+# Abstract serialization service to be sub-classed by specialized services.
+interface Serializer
+       # Main method of this service, serialize the `object`
+       fun serialize(object: nullable Serializable) is abstract
+
+       # Serialize an object as a "possible" reference, depending of the service
+       fun serialize_reference(object: Serializable) is abstract
+
+       # Serialize an attribute, used by `Serializable::core_serialize_to`
+       fun serialize_attribute(name: String, value: nullable Object)
+       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
+       end
+
+       # Warn of problems and potential errors (such as if an attribute
+       # is not serializable)
+       fun warn(msg: String) do print "Serialization warning: {msg}"
+end
+
+# Instances of this class can be passed to `Serializer::serialize`
+interface Serializable
+       # Full or true serialization
+       fun serialize_to(v: Serializer) do v.serialize(self)
+
+       # Body of the serialization of this class
+       # Can be redefed in sub classes and refinements
+       fun core_serialize_to(v: Serializer) do end
+
+       # Whether full serialization (calls `serialize_to`) or place only references
+       fun serialize_to_or_delay(v: Serializer) do v.serialize_reference(self)
+end
+
+# Instances of this class are not delayed and instead serialized immediately
+# This applies mainly to `universal` types
+interface DirectSerializable
+       super Serializable
+
+       redef fun serialize_to_or_delay(v) do serialize_to(v)
+end
+
+redef class Bool super DirectSerializable end
+redef class Char super DirectSerializable end
+redef class Int super DirectSerializable end
+redef class Float super DirectSerializable end
+redef class NativeString super DirectSerializable end
+redef class String super DirectSerializable end