[docs]classSerializer:""" A class for serializing Python objects into string payload. """
[docs]defprocess(self,value:SupportedTypes)->str:""" Serialize the given value into its string representation. Parameters ---------- value: The Object to serialize. Raises ------ TypeError If the type of value is not supported by serializer. """ifnotisinstance(value,SupportedTypes):raiseTypeError("Specified value for serialization has an unsupported type."f"Currently the serializer supports: {SupportedTypes}")ifvalueisNone:returnself.none()# Python versions 3.9, 3.8 do not support match statements ahh moment.handlers:dict[type,Callable[[SupportedTypes],str]]={str:self.serialize_str,int:self.serialize_int,float:self.serialize_float,bool:self.serialize_bool,list:self.serialize_list,tuple:self.serialize_tuple,set:self.serialize_set,dict:self.serialize_dict,}returnhandlers[type(value)](value)
[docs]@staticmethoddefserialize_str(value:SupportedTypes)->str:"""Returns the serialized value of type str."""assertisinstance(value,str)returnf"${len(value)}\r\n{value}\r\n"
[docs]@staticmethoddefserialize_int(value:SupportedTypes)->str:"""Returns the serialized value of type int."""assertisinstance(value,int)returnf":{value}\r\n"
[docs]@staticmethoddefserialize_float(value:SupportedTypes)->str:"""Returns the serialized value of type float."""assertisinstance(value,float)returnf",{value}\r\n"
[docs]@staticmethoddefserialize_bool(value:SupportedTypes)->str:"""Returns the serialized value of type bool."""assertisinstance(value,bool)return"#{}\r\n".format("t"ifvalueelse"f")
[docs]defserialize_list(self,value:SupportedTypes)->str:"""Returns the serialized value of type list."""assertisinstance(value,(list,tuple,set))returnf"*{len(value)}\r\n"+"".join((self.process(item)foriteminvalue))
[docs]defserialize_tuple(self,value:SupportedTypes)->str:"""Returns the serialized value of type tuple."""returnself.serialize_list(value)
[docs]defserialize_set(self,value:SupportedTypes)->str:"""Returns the serialized value of type set."""returnself.serialize_list(value)
[docs]defserialize_dict(self,value:SupportedTypes)->str:"""Returns the serialized value of type dict."""assertisinstance(value,dict)text:str=f"%{len(value)}\r\n"fork,vinvalue.items():text+=f"${len(str(k))}\r\n{k}\r\n{self.process(v)}"returntext
[docs]@staticmethoddefnone()->str:"""Returns the serialized value of type None."""return"_\r\n"