1use crate::types::NodeId;
2
3#[derive(Debug, thiserror::Error)]
5pub enum PoolError {
6 #[error("重复的节点 ID: {0}")]
8 DuplicateNodeId(NodeId),
9
10 #[error("父节点不存在: {0}")]
12 ParentNotFound(NodeId),
13
14 #[error("子节点不存在: {0}")]
16 ChildNotFound(NodeId),
17
18 #[error("节点不存在: {0}")]
20 NodeNotFound(NodeId),
21
22 #[error("检测到孤立节点: {0}")]
24 OrphanNode(NodeId),
25
26 #[error(
28 "无效的父子关系: 子节点 {child} 不是父节点 {alleged_parent} 的子节点"
29 )]
30 InvalidParenting { child: NodeId, alleged_parent: NodeId },
31
32 #[error(
34 "节点ID不匹配: 新节点ID({nodeid})与要替换的节点ID({new_node_id})不一致"
35 )]
36 InvalidNodeId { nodeid: NodeId, new_node_id: NodeId },
37
38 #[error("节点池为空")]
40 EmptyPool,
41
42 #[error("检测到循环引用: 节点 {0} 不能成为自己的祖先")]
44 CyclicReference(NodeId),
45
46 #[error("无效的节点移动: 无法将节点 {0} 移动到目标位置")]
48 InvalidNodeMove(NodeId),
49
50 #[error("节点 {0} 已被锁定,无法执行操作")]
52 NodeLocked(NodeId),
53
54 #[error("节点 {0} 已被删除")]
56 NodeDeleted(NodeId),
57
58 #[error("无法删除根节点")]
60 CannotRemoveRoot,
61}
62
63impl PoolError {
64 pub fn node_id(&self) -> Option<&NodeId> {
66 match self {
67 PoolError::DuplicateNodeId(id) => Some(id),
68 PoolError::ParentNotFound(id) => Some(id),
69 PoolError::ChildNotFound(id) => Some(id),
70 PoolError::NodeNotFound(id) => Some(id),
71 PoolError::OrphanNode(id) => Some(id),
72 PoolError::InvalidParenting { child, .. } => Some(child),
73 PoolError::InvalidNodeId { nodeid, .. } => Some(nodeid),
74 PoolError::CyclicReference(id) => Some(id),
75 PoolError::InvalidNodeMove(id) => Some(id),
76 PoolError::NodeLocked(id) => Some(id),
77 PoolError::NodeDeleted(id) => Some(id),
78 PoolError::EmptyPool => None,
79 PoolError::CannotRemoveRoot => None,
80 }
81 }
82}
83
84pub type PoolResult<T> = Result<T, PoolError>;