spectator/writer/new_writer.py (42 lines of code) (raw):

import sys from typing import Union from urllib.parse import urlparse from spectator.writer.file_writer import FileWriter from spectator.writer.memory_writer import MemoryWriter from spectator.writer.noop_writer import NoopWriter from spectator.writer.udp_writer import UdpWriter WriterUnion = Union[FileWriter, MemoryWriter, NoopWriter, UdpWriter] def is_valid_output_location(location: str) -> bool: if not isinstance(location, str): return False return location in ["none", "memory", "stdout", "stderr", "udp", "unix"] or \ location.startswith("file://") or \ location.startswith("udp://") def new_writer(location: str) -> WriterUnion: """Create a new Writer based on an output location.""" if location == "none": writer = NoopWriter() elif location == "memory": writer = MemoryWriter() elif location == "stderr": writer = FileWriter(location, sys.stderr) elif location == "stdout": writer = FileWriter(location, sys.stdout) elif location == "udp": # default udp port for spectatord location = "udp://127.0.0.1:1234" parsed = urlparse(location) address = (parsed.hostname, parsed.port) writer = UdpWriter(location, address) elif location == "unix": # default unix domain socket for spectatord location = "file:///run/spectatord/spectatord.unix" file = open(urlparse(location).path, "a", encoding="utf-8") writer = FileWriter(location, file) elif location.startswith("file://"): file = open(urlparse(location).path, "a", encoding="utf-8") writer = FileWriter(location, file) elif location.startswith("udp://"): parsed = urlparse(location) address = (parsed.hostname, parsed.port) writer = UdpWriter(location, address) else: raise ValueError(f"unsupported Writer location: {location}") return writer