| from __future__ import annotations | |
| from dataclasses import dataclass, field | |
| from enum import Enum | |
| from typing import Any | |
| class NodeType(Enum): | |
| KEY = "KEY" | |
| VALUE = "VALUE" | |
| LIST_KEY = "LIST_KEY" | |
| LIST_VALUE = "LIST_VALUE" | |
| class YamlNode: | |
| token: str | |
| node_type: NodeType | |
| depth: int | |
| sibling_index: int | |
| parent_path: str | |
| annotations: dict[str, Any] = field(default_factory=dict) | |
| def __repr__(self) -> str: | |
| return ( | |
| f"YamlNode({self.token!r}, {self.node_type.value}, " | |
| f"depth={self.depth}, sibling={self.sibling_index}, " | |
| f"path={self.parent_path!r})" | |
| ) | |
| def _extract_kind(nodes: list[YamlNode]) -> str: | |
| """Extract the kind value from a document's node list, normalized to canonical casing.""" | |
| from yaml_bert.vocab import normalize_kind | |
| for i, node in enumerate(nodes): | |
| if (node.token == "kind" | |
| and node.depth == 0 | |
| and node.node_type == NodeType.KEY | |
| and i + 1 < len(nodes) | |
| and nodes[i + 1].node_type == NodeType.VALUE): | |
| return normalize_kind(nodes[i + 1].token) | |
| return "" | |