service.py
1 from __future__ import annotations 2 3 from typing import Any, TypeVar, TYPE_CHECKING 4 5 from pydantic import Field 6 7 from .public_service import PublicService 8 from ...exceptions import ServiceNotFoundError 9 10 if TYPE_CHECKING: 11 from ...client import Client 12 13 ServiceType = TypeVar("ServiceType", bound="Service") 14 15 16 class Service(PublicService): 17 owner_uuid: str = Field(alias="owner") 18 running: bool 19 part_owner_uuid: str | None = Field(alias="part_owner") 20 speed: float 21 22 @staticmethod 23 def get_services(client: Client, device_uuid: str) -> list[Service]: 24 return [ 25 Service.parse(client, service) 26 for service in client.ms("service", ["list"], device_uuid=device_uuid)["services"] 27 ] 28 29 @staticmethod 30 def get_service(client: Client, device_uuid: str, service_uuid: str) -> Service: 31 return Service.parse( 32 client, client.ms("service", ["private_info"], device_uuid=device_uuid, service_uuid=service_uuid) 33 ) 34 35 @staticmethod 36 def get_service_by_name(client: Client, device_uuid: str, name: str) -> Service: 37 for service in Service.get_services(client, device_uuid): 38 if service.name == name: 39 return service 40 raise ServiceNotFoundError 41 42 @staticmethod 43 def list_part_owner(client: Client) -> list[Service]: 44 return [Service.parse(client, service) for service in client.ms("service", ["list_part_owner"])["services"]] 45 46 def update(self) -> Service: 47 return self._update(Service.get_service(self._client, self.device_uuid, self.uuid)) 48 49 def use(self, **data: Any) -> dict[Any, Any]: 50 return self._ms("service", ["use"], device_uuid=self.device_uuid, service_uuid=self.uuid, **data) 51 52 def toggle(self) -> Service: 53 return self._update(self._ms("service", ["toggle"], device_uuid=self.device_uuid, service_uuid=self.uuid)) 54 55 def delete(self) -> None: 56 self._ms("service", ["delete"], device_uuid=self.device_uuid, service_uuid=self.uuid)