from datetime import datetime, timezone from typing import Callable, Generator, Optional, TypeVar from .capi import ffi, lib T = TypeVar("T") def as_dc_charpointer(obj): if obj == ffi.NULL or obj is None: return ffi.NULL if not isinstance(obj, bytes): return obj.encode("utf8") return obj def iter_array(dc_array_t, constructor: Callable[[int], T]) -> Generator[T, None, None]: for i in range(lib.dc_array_get_cnt(dc_array_t)): yield constructor(lib.dc_array_get_id(dc_array_t, i)) def from_dc_charpointer(obj) -> str: if obj != ffi.NULL: return ffi.string(ffi.gc(obj, lib.dc_str_unref)).decode("utf8") raise ValueError def from_optional_dc_charpointer(obj) -> Optional[str]: if obj != ffi.NULL: return ffi.string(ffi.gc(obj, lib.dc_str_unref)).decode("utf8") return None class DCLot: def __init__(self, dc_lot) -> None: self._dc_lot = dc_lot def id(self) -> int: return lib.dc_lot_get_id(self._dc_lot) def state(self): return lib.dc_lot_get_state(self._dc_lot) def text1(self): return from_dc_charpointer(lib.dc_lot_get_text1(self._dc_lot)) def text1_meaning(self): return lib.dc_lot_get_text1_meaning(self._dc_lot) def text2(self): return from_dc_charpointer(lib.dc_lot_get_text2(self._dc_lot)) def timestamp(self): ts = lib.dc_lot_get_timestamp(self._dc_lot) if ts == 0: return None return datetime.fromtimestamp(ts, timezone.utc)