use anyhow::Result;
use crate::sdf::Value;
use crate::usd::{Attribute, SchemaBase};
use super::connectable::{input_name, output_name};
use super::tokens::{META_CONNECTABILITY, META_RENDER_TYPE, NS_INPUTS, NS_OUTPUTS};
use super::Connectability;
pub trait Connectable: SchemaBase {
fn input(&self, base: &str) -> Attribute {
self.prim().attribute(&input_name(base))
}
fn create_input(&self, base: &str, type_name: &str) -> Result<Attribute> {
Ok(self
.prim()
.create_attribute(&input_name(base), type_name)?
.set_custom(false)?)
}
fn output(&self, base: &str) -> Attribute {
self.prim().attribute(&output_name(base))
}
fn create_output(&self, base: &str, type_name: &str) -> Result<Attribute> {
Ok(self
.prim()
.create_attribute(&output_name(base), type_name)?
.set_custom(false)?)
}
fn input_names(&self) -> Result<Vec<String>> {
Ok(self
.prim()
.property_names()?
.into_iter()
.filter_map(|p| p.strip_prefix(NS_INPUTS).map(str::to_string))
.collect())
}
fn output_names(&self) -> Result<Vec<String>> {
Ok(self
.prim()
.property_names()?
.into_iter()
.filter_map(|p| p.strip_prefix(NS_OUTPUTS).map(str::to_string))
.collect())
}
fn input_connectability(&self, base: &str) -> Result<Connectability> {
Ok(self
.input(base)
.get_metadata::<Connectability>(META_CONNECTABILITY)?
.unwrap_or_default())
}
fn set_input_connectability(&self, base: &str, connectability: Connectability) -> Result<()> {
self.input(base).set_metadata(META_CONNECTABILITY, connectability)?;
Ok(())
}
fn input_render_type(&self, base: &str) -> Result<Option<String>> {
self.input(base).get_metadata::<String>(META_RENDER_TYPE)
}
fn set_input_render_type(&self, base: &str, render_type: &str) -> Result<()> {
self.input(base)
.set_metadata(META_RENDER_TYPE, Value::Token(render_type.to_string()))?;
Ok(())
}
fn output_render_type(&self, base: &str) -> Result<Option<String>> {
self.output(base).get_metadata::<String>(META_RENDER_TYPE)
}
fn set_output_render_type(&self, base: &str, render_type: &str) -> Result<()> {
self.output(base)
.set_metadata(META_RENDER_TYPE, Value::Token(render_type.to_string()))?;
Ok(())
}
}