1use sea_orm::{
2 ActiveModelBehavior, ActiveModelTrait, EntityTrait, FromQueryResult, IntoActiveModel, Value,
3};
4
5use crate::config::ClosureTreeConfig;
6
7pub trait ClosureTreeModel:
11 Clone + Send + Sync + 'static + IntoActiveModel<Self::ActiveModel> + FromQueryResult
12{
13 type Entity: EntityTrait<Model = Self>;
14 type ActiveModel: ActiveModelTrait<Entity = Self::Entity> + ActiveModelBehavior + Send;
15 type Id: Clone + Send + Sync + 'static;
16
17 type HierarchyEntity: EntityTrait<Model = Self::HierarchyModel>;
18 type HierarchyModel: Clone + Send + Sync + 'static + FromQueryResult;
19 type HierarchyActiveModel: ActiveModelTrait<Entity = Self::HierarchyEntity>
20 + ActiveModelBehavior
21 + Send;
22
23 fn closure_tree_config() -> &'static ClosureTreeConfig;
24
25 fn id(&self) -> Self::Id;
26 fn parent_id(&self) -> Option<Self::Id>;
27 fn set_parent(active: &mut Self::ActiveModel, parent: Option<Self::Id>);
28 fn id_to_value(id: &Self::Id) -> Value;
29
30 fn name(&self) -> &str;
31 fn set_name(active: &mut Self::ActiveModel, name: &str);
32
33 fn parent_column() -> <Self::Entity as EntityTrait>::Column;
34 fn id_column() -> <Self::Entity as EntityTrait>::Column;
35 fn name_column() -> <Self::Entity as EntityTrait>::Column;
36
37 fn hierarchy_ancestor_column() -> <Self::HierarchyEntity as EntityTrait>::Column;
38 fn hierarchy_descendant_column() -> <Self::HierarchyEntity as EntityTrait>::Column;
39 fn hierarchy_generations_column() -> <Self::HierarchyEntity as EntityTrait>::Column;
40
41 fn hierarchy_id_to_value(id: &Self::Id) -> Value;
42 fn hierarchy_model_ancestor(model: &Self::HierarchyModel) -> Self::Id;
43 fn hierarchy_model_descendant(model: &Self::HierarchyModel) -> Self::Id;
44 fn hierarchy_model_generations(model: &Self::HierarchyModel) -> i32;
45 fn hierarchy_build_row(
46 ancestor: Self::Id,
47 descendant: Self::Id,
48 generations: i32,
49 ) -> Self::HierarchyActiveModel;
50}