from __future__ import annotations

import textwrap
import traceback

class MultiError(Exception):

    def __init__(self, msg, *args, errors=()):
        if errors:
            types = set(type(e).__name__ for e in errors)
            msg = f'{msg}; {len(errors)} sub errors: ({", ".join(types)})'
            for er in errors:
                self.get_error_types(error_message=type(er).__name__)
                exc_fmt = traceback.format_exception(er)
                msg += f'\n + {exc_fmt[0]}'
                er_tb = ''.join(exc_fmt[1:])
                er_tb = textwrap.indent(er_tb, ' | ', lambda _: True)
                msg += f'{er_tb}\n'
        super().__init__(msg, *args)
        self.__errors__ = tuple(errors)

    def get_error_types(self, error_message : str):
        print('error : ' + error_message)
        return {type(e) for e in self.__errors__}
