module dpq.serialisers.scalar;

import std.traits;
import std.bitmanip;
import std.typecons;
import std..string : format;

import dpq.serialisation;

struct ScalarSerialiser
{
	static bool isSupportedType(T)()
	{
		return isScalarType!T;
	}

	static Nullable!(ubyte[]) serialise(T)(T val)
	{
		static assert (
				isSupportedType!T,
				"'%s' is not supported by ScalarSerialiser".format(T.stringof));

		alias RT = Nullable!(ubyte[]);
		import std.stdio;

		if (isAnyNull(val))
			return RT.init;

		return RT(nativeToBigEndian(val).dup);
	}
	
	static T deserialise(T)(const(ubyte)[] bytes)
	{
		static assert (
				isSupportedType!T,
				"'%s' is not supported by ScalarSerialiser".format(T.stringof));

		return bytes.read!T;
	}
}