diff --git a/src/pyDataInterface/data_service/data_service.py b/src/pyDataInterface/data_service/data_service.py index 54e0036..110745d 100644 --- a/src/pyDataInterface/data_service/data_service.py +++ b/src/pyDataInterface/data_service/data_service.py @@ -1,6 +1,7 @@ import asyncio import inspect from collections.abc import Callable +from enum import Enum from itertools import chain from typing import Any @@ -517,6 +518,15 @@ class DataService(rpyc.Service): "readonly": prop.fset is None, "doc": inspect.getdoc(prop), } + elif isinstance(value, Enum): + result[key] = { + "type": "Enum", + "value": value.name, + "enum": { + name: member.value + for name, member in value.__class__.__members__.items() + }, + } else: result[key] = { "type": type(value).__name__, diff --git a/src/pyDataInterface/server/server.py b/src/pyDataInterface/server/server.py index 106de4d..0130a3d 100644 --- a/src/pyDataInterface/server/server.py +++ b/src/pyDataInterface/server/server.py @@ -3,6 +3,7 @@ import os import signal import threading from concurrent.futures import ThreadPoolExecutor +from enum import Enum from types import FrameType from typing import Any, Optional @@ -147,7 +148,11 @@ class Server: "data": { "parent_path": parent_path, "name": name, - "value": value, + "value": value.name + if isinstance( + value, Enum + ) # enums are not JSON serializable + else value, } }, ) diff --git a/src/pyDataInterface/server/web_server.py b/src/pyDataInterface/server/web_server.py index 6291441..1900c35 100644 --- a/src/pyDataInterface/server/web_server.py +++ b/src/pyDataInterface/server/web_server.py @@ -1,3 +1,4 @@ +from enum import Enum from pathlib import Path from typing import Any, TypedDict @@ -55,6 +56,10 @@ class WebAPI: attr = getattr(self.service, data["name"]) if isinstance(attr, DataService): attr.apply_updates(data["value"]) + elif isinstance(attr, Enum): + setattr( + self.service, data["name"], attr.__class__[data["value"]["value"]] + ) else: setattr(self.service, data["name"], data["value"])