reactive_graph_table_model/instances/
entities.rs

1use 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    /// The id of the entity instance.
31    pub id: Uuid,
32
33    /// The type namespace.
34    pub namespace: String,
35
36    /// The type name.
37    pub name: String,
38
39    /// Textual description of the entity instance.
40    pub description: String,
41
42    /// The components.
43    #[tabled(display("display_component_type_ids", self))]
44    pub components: Vec<ComponentTypeId>,
45
46    /// The property instances.
47    #[tabled(display("display_property_instances", self))]
48    pub properties: Vec<PropertyInstance>,
49
50    /// The extensions.
51    #[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    // println!("{:?}", &self.inline_format);
74    match entity_instance.inline_format {
75        TableInlineFormat::Table => display_extensions_inline_str(extensions),
76        TableInlineFormat::Html => display_extensions_html_inline(extensions),
77    }
78}
79
80// impl EntityInstance {
81// }
82
83impl 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        // .with(Modify::new(Columns::new(1..2)).with(Width::increase(22)))
131        // .with(Modify::new(Columns::new(2..3)).with(Width::wrap(40)))
132        // .with(Modify::new(Columns::new(3..4)).with(Width::wrap(80)))
133        .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}