162306a36Sopenharmony_ci#!/usr/bin/env python3
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
362306a36Sopenharmony_ci#
462306a36Sopenharmony_ci# Utilities for printing and coloring output.
562306a36Sopenharmony_ci#
662306a36Sopenharmony_ci# Copyright (C) 2022, Google LLC.
762306a36Sopenharmony_ci# Author: Daniel Latypov <dlatypov@google.com>
862306a36Sopenharmony_ci
962306a36Sopenharmony_ciimport datetime
1062306a36Sopenharmony_ciimport sys
1162306a36Sopenharmony_ciimport typing
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci_RESET = '\033[0;0m'
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ciclass Printer:
1662306a36Sopenharmony_ci	"""Wraps a file object, providing utilities for coloring output, etc."""
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci	def __init__(self, output: typing.IO[str]):
1962306a36Sopenharmony_ci		self._output = output
2062306a36Sopenharmony_ci		self._use_color = output.isatty()
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci	def print(self, message: str) -> None:
2362306a36Sopenharmony_ci		print(message, file=self._output)
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci	def print_with_timestamp(self, message: str) -> None:
2662306a36Sopenharmony_ci		ts = datetime.datetime.now().strftime('%H:%M:%S')
2762306a36Sopenharmony_ci		self.print(f'[{ts}] {message}')
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	def _color(self, code: str, text: str) -> str:
3062306a36Sopenharmony_ci		if not self._use_color:
3162306a36Sopenharmony_ci			return text
3262306a36Sopenharmony_ci		return code + text + _RESET
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	def red(self, text: str) -> str:
3562306a36Sopenharmony_ci		return self._color('\033[1;31m', text)
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	def yellow(self, text: str) -> str:
3862306a36Sopenharmony_ci		return self._color('\033[1;33m', text)
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	def green(self, text: str) -> str:
4162306a36Sopenharmony_ci		return self._color('\033[1;32m', text)
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci	def color_len(self) -> int:
4462306a36Sopenharmony_ci		"""Returns the length of the color escape codes."""
4562306a36Sopenharmony_ci		return len(self.red(''))
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci# Provides a default instance that prints to stdout
4862306a36Sopenharmony_cistdout = Printer(sys.stdout)
49