code: 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())