from typing import overload, Generic, List, Mapping, Optional, Sequence, TypeVar, Dict, Any

from ._project import Project

TNode = TypeVar("TNode", bound="Node")
TValidNodeValue = TypeVar("TValidNodeValue", int, str, bool, Mapping, Sequence)

class ProvenanceInformation: ...

class Node:
    def clone(self) -> "Node": ...
    def get_provenance(self) -> ProvenanceInformation: ...
    def strip_node_info(self) -> Dict[str, Any]: ...

class MappingNode(Node, Generic[TNode]):
    def __init__(self, file_index: int, line: int, column: int, value: Mapping[str, TValidNodeValue]) -> None: ...
    def clone(self) -> MappingNode[TNode]: ...
    def validate_keys(self, valid_keys: List[str]): ...
    @overload
    def get_str_list(self, key: str) -> List[str]: ...
    @overload
    def get_str_list(self, key: str, default: List[str]) -> List[str]: ...
    @overload
    def get_str_list(self, key: str, default: Optional[List[str]]) -> Optional[List[str]]: ...
    @overload
    def get_str(self, key: str) -> str: ...
    @overload
    def get_str(self, key: str, default: str) -> str: ...
    @overload
    def get_str(self, key: str, default: Optional[str]) -> Optional[str]: ...
    @overload
    def get_int(self, key: str) -> int: ...
    @overload
    def get_int(self, key: str, default: int) -> int: ...
    @overload
    def get_int(self, key: str, default: Optional[int]) -> Optional[int]: ...
    @overload
    def get_mapping(self, key: str) -> "MappingNode": ...
    @overload
    def get_mapping(self, key: str, default: "MappingNode") -> "MappingNode": ...
    @overload
    def get_mapping(self, key: str, default: Optional["MappingNode"]) -> Optional["MappingNode"]: ...

class ScalarNode(Node):
    def as_str(self) -> str: ...
    def clone(self) -> "ScalarNode": ...

class SequenceNode(Node, Generic[TNode]):
    def as_str_list(self) -> List[str]: ...
    def clone(self) -> "SequenceNode[TNode]": ...

def _assert_symbol_name(
    symbol_name: str, purpose: str, *, ref_node: Optional[Node], allow_dashes: bool = True
) -> None: ...
def _new_synthetic_file(filename: str, project: Optional[Project]) -> MappingNode[TNode]: ...
