def parse_commit_message(message: str) -> Tuple[int, str, Optional[str], Tuple[str, str, str]]:
    parsed = re_parser.match(message)
    if not parsed:
        raise UnknownCommitMessageStyleError(
            'Unable to parse the given commit message: {0}'.format(message)
        )
    subject = parsed.group('subject')
    if config.get('semantic_release', 'minor_tag') in message:
        level = 'feature'
        level_bump = 2
        if subject:
            subject = subject.replace(config.get('semantic_release', 'minor_tag'.format(level)), '')
    elif config.get('semantic_release', 'fix_tag') in message:
        level = 'fix'
        level_bump = 1
        if subject:
            subject = subject.replace(config.get('semantic_release', 'fix_tag'.format(level)), '')
    else:
        raise UnknownCommitMessageStyleError(
            'Unable to parse the given commit message: {0}'.format(message)
        )
    if parsed.group('text') and 'BREAKING CHANGE' in parsed.group('text'):
        level = 'breaking'
        level_bump = 3
    body, footer = parse_text_block(parsed.group('text'))
    return level_bump, level, None, (subject.strip(), body.strip(), footer.strip())