"""
This module provides private data for the base implementation for the
:module:`hyperscan` library.

WARNING: The *pathspec._backends.hyperscan* package is not part of the public
API. Its contents and structure are likely to change.
"""
from __future__ import annotations

from dataclasses import (
	dataclass)
from typing import (
	Union)  # Replaced by `X | Y` in 3.10.

try:
	import hyperscan
except ModuleNotFoundError:
	hyperscan = None  # type: ignore[assignment]
	HS_FLAGS = 0
else:
	HS_FLAGS = hyperscan.HS_FLAG_SINGLEMATCH | hyperscan.HS_FLAG_UTF8

HS_FLAGS: int  # type: ignore[no-redef]
"""
The hyperscan flags to use:

-	HS_FLAG_SINGLEMATCH is needed to ensure the partial patterns only match once.

-	HS_FLAG_UTF8 is required to support unicode paths.
"""


@dataclass(frozen=True)
class HyperscanExprDat(object):
	"""
	The :class:`HyperscanExprDat` class is used to store data related to an
	expression.
	"""

	# The slots argument is not supported until Python 3.10.
	__slots__ = [
		'include',
		'index',
		'is_dir_pattern',
	]

	include: bool
	"""
	*include* (:class:`bool`) is whether is whether the matched files should be
	included (:data:`True`), or excluded (:data:`False`).
	"""

	index: int
	"""
	*index* (:class:`int`) is the pattern index.
	"""

	is_dir_pattern: bool
	"""
	*is_dir_pattern* (:class:`bool`) is whether the pattern is a directory
	pattern for gitignore.
	"""


@dataclass(frozen=True)
class HyperscanExprDebug(HyperscanExprDat):
	"""
	The :class:`HyperscanExprDebug` class stores additional debug information
	related to an expression.
	"""

	# The slots argument is not supported until Python 3.10.
	__slots__ = ['regex']

	regex: Union[str, bytes]
	"""
	*regex* (:class:`str` or :class:`bytes`) is the regular expression.
	"""
