2828from kitty .fast_data_types import (
2929 FILE_TRANSFER_CODE , OSC , add_timer , get_boss , get_options
3030)
31+ from kitty .types import run_once
3132
3233from .utils import log_error , sanitize_control_codes
3334
@@ -233,24 +234,40 @@ def as_ftc(self, request_id: str) -> 'FileTransmissionCommand':
233234 )
234235
235236
237+ @run_once
238+ def name_to_serialized_map () -> Dict [str , str ]:
239+ ans : Dict [str , str ] = {}
240+ for k in fields (FileTransmissionCommand ):
241+ ans [k .name ] = k .metadata .get ('sname' , k .name )
242+ return ans
243+
244+
245+ @run_once
246+ def serialized_to_field_map () -> Dict [bytes , Field [Any ]]:
247+ ans : Dict [bytes , Field [Any ]] = {}
248+ for k in fields (FileTransmissionCommand ):
249+ ans [k .metadata .get ('sname' , k .name ).encode ('ascii' )] = k
250+ return ans
251+
252+
236253@dataclass
237254class FileTransmissionCommand :
238255
239- action : Action = Action .invalid
240- compression : Compression = Compression .none
241- ftype : FileType = FileType .regular
242- ttype : TransmissionType = TransmissionType .simple
256+ action : Action = field ( default = Action .invalid , metadata = { 'sname' : 'ac' })
257+ compression : Compression = field ( default = Compression .none , metadata = { 'sname' : 'zip' })
258+ ftype : FileType = field ( default = FileType .regular , metadata = { 'sname' : 'ft' })
259+ ttype : TransmissionType = field ( default = TransmissionType .simple , metadata = { 'sname' : 'tt' })
243260 id : str = ''
244- file_id : str = ''
245- bypass : str = field (default = '' , metadata = {'base64' : True })
246- quiet : int = 0
247- mtime : int = - 1
248- permissions : int = - 1
249- size : int = - 1
250- name : str = field (default = '' , metadata = {'base64' : True })
251- status : str = field (default = '' , metadata = {'base64' : True })
252- parent : str = field (default = '' , metadata = {'base64' : True })
253- data : bytes = field (default = b'' , repr = False )
261+ file_id : str = field ( default = '' , metadata = { 'sname' : 'fid' })
262+ bypass : str = field (default = '' , metadata = {'base64' : True , 'sname' : 'pw' })
263+ quiet : int = field ( default = 0 , metadata = { 'sname' : 'q' })
264+ mtime : int = field ( default = - 1 , metadata = { 'sname' : 'mod' })
265+ permissions : int = field ( default = - 1 , metadata = { 'sname' : 'prm' })
266+ size : int = field ( default = - 1 , metadata = { 'sname' : 'sz' })
267+ name : str = field (default = '' , metadata = {'base64' : True , 'sname' : 'n' })
268+ status : str = field (default = '' , metadata = {'base64' : True , 'sname' : 'st' })
269+ parent : str = field (default = '' , metadata = {'base64' : True , 'sname' : 'pr' })
270+ data : bytes = field (default = b'' , repr = False , metadata = { 'sname' : 'd' } )
254271
255272 def __repr__ (self ) -> str :
256273 ans = []
@@ -274,6 +291,7 @@ def asdict(self, keep_defaults: bool = False) -> Dict[str, Union[str, int, bytes
274291 return ans
275292
276293 def get_serialized_fields (self , prefix_with_osc_code : bool = False ) -> Iterator [Union [str , bytes ]]:
294+ nts = name_to_serialized_map ()
277295 found = False
278296 if prefix_with_osc_code :
279297 yield ftc_prefix
@@ -288,7 +306,7 @@ def get_serialized_fields(self, prefix_with_osc_code: bool = False) -> Iterator[
288306 yield ';'
289307 else :
290308 found = True
291- yield name
309+ yield nts [ name ]
292310 yield '='
293311 if issubclass (k .type , Enum ):
294312 yield val .name
@@ -310,10 +328,7 @@ def serialize(self, prefix_with_osc_code: bool = False) -> str:
310328 @classmethod
311329 def deserialize (cls , data : Union [str , bytes , memoryview ]) -> 'FileTransmissionCommand' :
312330 ans = FileTransmissionCommand ()
313- fmap : Dict [bytes , 'Field[Union[str, int, bytes, Enum]]' ] = getattr (cls , 'fmap' , None )
314- if not fmap :
315- fmap = {k .name .encode ('ascii' ): k for k in fields (cls )}
316- setattr (cls , 'fmap' , fmap )
331+ fmap = serialized_to_field_map ()
317332 from kittens .transfer .rsync import decode_utf8_buffer , parse_ftc
318333
319334 def handle_item (key : memoryview , val : memoryview , has_semicolons : bool ) -> None :
0 commit comments