module dpq.serialisers..string; import dpq.serialisation; import std..string : representation; import std.traits; import std.conv : to; import std.typecons : Nullable; struct StringSerialiser { static bool isSupportedType(T)() { return isSomeString!T; } static Nullable!(ubyte[]) serialise(T)(T val) { static assert ( isSupportedType!T, "'%s' is not supported by StringSerialiser".format(T.stringof)); alias RT = Nullable!(ubyte[]); if (isAnyNull(val)) return RT.init; return RT(val.representation.dup); } static T deserialise(T)(const (ubyte)[] bytes) { static assert ( isSupportedType!T, "'%s' is not supported by StringSerialiser".format(T.stringof)); return cast(T) bytes; } } unittest { import std.stdio; writeln(" * StringSerialiser"); string str = "Aa b"; auto serialised = StringSerialiser.serialise(str); assert(!serialised.isNull); writefln("Serialised string %s", serialised); assert(str == StringSerialiser.deserialise!string(serialised)); }