from subprocess import CalledProcessError, run
from tempfile import NamedTemporaryFile
from typing import List
from loguru import logger
from . import ENV, PARSERS
from .parser_errors import NoParserForMessage, NoValidParserForMessage
def parse_messages(data: str) -> List:
logger.trace("Parsing: {}", data)
parsers = [parser for parser in PARSERS if parser.validate(data)]
logger.trace("Parsers for this mesage:")
[logger.trace("{}", repr(parser)) for parser in parsers]
logger.info("Parsers found for this message: {}", len(parsers))
if not len(parsers):
raise NoValidParserForMessage
for parser in parsers:
try:
messages = parser.parse(data)
except Exception as e:
logger.trace("Parser encountered error while parsing message: {}", parser)
logger.trace("Exception: {}", e)
else:
return messages
raise NoParserForMessage
def print_message(message: str) -> bool:
"""
Sends a plaintext message to CUPS for printing.
The message format can be customized by setting the environment's
MESSAGE_FORMAT to a string, where `{message}` is replaced with
the message text.
"""
logger.info("Printing message!")
logger.debug("{}", message)
with NamedTemporaryFile(mode="w+") as tmp_file:
logger.debug("Print file: {}", tmp_file.name)
tmp_file.write(ENV.MESSAGE_FORMAT.format(message=message))
tmp_file.flush()
try:
print_cmd = ENV.print_command(tmp_file.name)
logger.debug("Print command: {}", print_cmd)
run(print_cmd, check=True, timeout=ENV.PRINT_JOB_TIMEOUT)
except CalledProcessError:
return False
return True