use super::{
super::{
super::{
super::{data::*, entities::*, store::*},
bindings::floria::plugins::floria as bindings,
errors::*,
},
host::*,
},
map::Map as BindingsMap,
};
use {kutil::std::immutable::*, std::collections::*, wasmtime::component::Resource};
impl<StoreT> PluginHost<StoreT>
where
StoreT: Store,
{
pub fn vertex_to_bindings(&mut self, vertex: Vertex) -> Result<bindings::Vertex, PluginError> {
Ok(bindings::Vertex {
id: vertex.instance.id.into(),
origin_template_id: id_option_to_bindings(vertex.instance.origin_template_id),
metadata: self.metadata_to_bindings(vertex.instance.metadata)?,
class_ids: ids_to_bindings(vertex.instance.class_ids),
properties: self.properties_to_bindings(vertex.instance.properties)?,
containing_vertex_id: id_option_to_bindings(vertex.containing_vertex_id),
contained_vertex_ids: ids_to_bindings(vertex.contained_vertex_ids),
outgoing_edge_ids: ids_to_bindings(vertex.outgoing_edge_ids),
incoming_edge_ids: ids_to_bindings(vertex.incoming_edge_ids),
})
}
pub fn edge_to_bindings(&mut self, edge: Edge) -> Result<bindings::Edge, PluginError> {
Ok(bindings::Edge {
id: edge.instance.id.into(),
origin_template_id: id_option_to_bindings(edge.instance.origin_template_id),
metadata: self.metadata_to_bindings(edge.instance.metadata)?,
class_ids: ids_to_bindings(edge.instance.class_ids),
properties: self.properties_to_bindings(edge.instance.properties)?,
source_vertex_id: edge.source_vertex_id.into(),
target_vertex_id: edge.target_vertex_id.into(),
})
}
pub fn metadata_to_bindings(&mut self, metadata: Metadata) -> Result<Resource<BindingsMap>, PluginError> {
let mut key_value_pairs = Vec::with_capacity(metadata.inner.len());
for (key, value) in metadata {
key_value_pairs
.push((self.expression_to_bindings(key.into())?, self.expression_to_bindings(value.into())?));
}
Ok(self.resources.push(BindingsMap::new(key_value_pairs))?)
}
pub fn property_to_bindings(&mut self, property: Property) -> Result<bindings::Property, PluginError> {
Ok(bindings::Property {
metadata: self.metadata_to_bindings(property.metadata)?,
class_ids: ids_to_bindings(property.class_ids),
read_only: property.read_only,
preparer: self.expression_option_to_bindings(property.preparer)?,
updater: self.expression_option_to_bindings(property.updater)?,
value: self.expression_option_to_bindings(property.value)?,
})
}
fn properties_to_bindings(
&mut self,
properties: BTreeMap<ByteString, Property>,
) -> Result<Vec<(String, bindings::Property)>, PluginError> {
let mut property_bindings = Vec::with_capacity(properties.len());
for (name, property) in properties {
property_bindings.push((name.into(), self.property_to_bindings(property)?));
}
Ok(property_bindings)
}
fn expression_option_to_bindings(
&mut self,
expression: Option<Expression>,
) -> Result<Option<bindings::Expression>, PluginError> {
Ok(match expression {
Some(expression) => Some(self.expression_to_bindings(expression)?),
None => None,
})
}
}
fn id_option_to_bindings(id: Option<ID>) -> Option<bindings::Id> {
id.map(|id| id.into())
}
fn ids_to_bindings(ids: Vec<ID>) -> Vec<bindings::Id> {
ids.into_iter().map(|id| id.into()).collect()
}