reactive_graph_table_model/instances/
entities.rs1use crate::container::TableInlineFormat;
2use crate::container::TableInlineFormatSetter;
3use crate::container::TableOptions;
4use crate::instances::properties::PropertyInstance;
5use crate::instances::properties::PropertyInstances;
6use crate::instances::properties::display_property_instances_html_inline;
7use crate::instances::properties::display_property_instances_inline_str;
8use crate::styles::modern_inline::modern_inline;
9use crate::types::component::ComponentTypeId;
10use crate::types::component::ComponentTypeIds;
11use crate::types::component::display_component_type_ids_html_inline;
12use crate::types::component::display_component_type_ids_inline_str;
13use crate::types::extension::Extension;
14use crate::types::extension::Extensions;
15use crate::types::extension::display_extensions_html_inline;
16use crate::types::extension::display_extensions_inline_str;
17use reactive_graph_graph::NamespacedTypeGetter;
18use table_to_html::HtmlTable;
19use tabled::Table;
20use tabled::Tabled;
21use tabled::settings::Modify;
22use tabled::settings::Style;
23use tabled::settings::Width;
24use tabled::settings::object::Columns;
25use tabled::settings::object::Segment;
26use uuid::Uuid;
27
28#[derive(Clone, Debug, Tabled)]
29pub struct EntityInstance {
30 pub id: Uuid,
32
33 pub namespace: String,
35
36 pub name: String,
38
39 pub description: String,
41
42 #[tabled(display("display_component_type_ids", self))]
44 pub components: Vec<ComponentTypeId>,
45
46 #[tabled(display("display_property_instances", self))]
48 pub properties: Vec<PropertyInstance>,
49
50 #[tabled(display("display_extensions", self))]
52 pub extensions: Vec<Extension>,
53
54 #[tabled(skip)]
55 inline_format: TableInlineFormat,
56}
57
58fn display_component_type_ids(components: &[ComponentTypeId], entity_instance: &EntityInstance) -> String {
59 match entity_instance.inline_format {
60 TableInlineFormat::Table => display_component_type_ids_inline_str(components),
61 TableInlineFormat::Html => display_component_type_ids_html_inline(components),
62 }
63}
64
65fn display_property_instances(properties: &[PropertyInstance], entity_instance: &EntityInstance) -> String {
66 match entity_instance.inline_format {
67 TableInlineFormat::Table => display_property_instances_inline_str(properties),
68 TableInlineFormat::Html => display_property_instances_html_inline(properties),
69 }
70}
71
72fn display_extensions(extensions: &[Extension], entity_instance: &EntityInstance) -> String {
73 match entity_instance.inline_format {
75 TableInlineFormat::Table => display_extensions_inline_str(extensions),
76 TableInlineFormat::Html => display_extensions_html_inline(extensions),
77 }
78}
79
80impl TableInlineFormatSetter for EntityInstance {
84 fn set_table_inline_format(&mut self, table_inline_format: TableInlineFormat) {
85 self.inline_format = table_inline_format;
86 }
87}
88
89impl From<reactive_graph_graph::EntityInstance> for EntityInstance {
90 fn from(entity_instance: reactive_graph_graph::EntityInstance) -> Self {
91 EntityInstance {
92 id: entity_instance.id,
93 namespace: entity_instance.namespace(),
94 name: entity_instance.type_name(),
95 description: entity_instance.description,
96 components: ComponentTypeIds::from(entity_instance.components).0,
97 properties: PropertyInstances::from(entity_instance.properties).0,
98 extensions: Extensions::from(entity_instance.extensions).0,
99 inline_format: Default::default(),
100 }
101 }
102}
103
104pub struct EntityInstancesTableOptions;
105
106impl TableOptions for EntityInstancesTableOptions {
107 fn options(table: &mut Table) -> &mut Table {
108 table.with(Style::extended()).with(
109 Modify::new(Segment::new(0.., 0..3))
110 .with(Width::increase(22))
111 .with(Width::increase(22))
112 .with(Width::wrap(40).keep_words(true)),
113 )
114 }
115}
116
117pub fn display_entity_instances_inline_str(entity_instances: &[EntityInstance]) -> String {
118 if entity_instances.is_empty() {
119 String::new()
120 } else {
121 display_entity_instances_inline(entity_instances).to_string()
122 }
123}
124
125pub fn display_entity_instances_inline(entity_instances: &[EntityInstance]) -> Table {
126 let entity_instances = entity_instances.to_vec();
127 Table::new(entity_instances)
128 .with(modern_inline())
129 .with(Modify::new(Columns::new(0..1)).with(Width::increase(22)))
130 .to_owned()
134}
135
136pub fn display_entity_instances_html_inline(entity_instances: &[EntityInstance]) -> String {
137 let entity_instances = entity_instances.to_vec();
138 if entity_instances.is_empty() {
139 return String::new();
140 }
141 HtmlTable::with_header(Vec::<Vec<String>>::from(Table::builder(&entity_instances)))
142 .to_string()
143 .split_whitespace()
144 .collect()
145}