#![allow(dead_code)]
use anyhow::Result;
use crate::sdf::{FieldKey, Path};
use crate::tf;
use crate::usd::{Prim, Stage};
pub(crate) fn read_token(stage: &Stage, prim: &Path, name: &str) -> Result<Option<tf::Token>> {
stage.field::<tf::Token>(prim.append_property(name)?, FieldKey::Default)
}
pub(crate) fn get_typed(stage: &Stage, path: impl Into<Path>, type_name: impl Into<tf::Token>) -> Result<Option<Prim>> {
let prim = stage.prim(path);
if prim.type_name()? != Some(type_name.into()) {
return Ok(None);
}
Ok(Some(prim))
}
pub(crate) fn get_typed_any(
stage: &Stage,
path: impl Into<Path>,
type_names: &[impl AsRef<str>],
) -> Result<Option<Prim>> {
let prim = stage.prim(path);
match prim.type_name()? {
Some(t) if type_names.iter().any(|n| n.as_ref() == t.as_str()) => Ok(Some(prim)),
_ => Ok(None),
}
}
pub(crate) fn get_with_api(stage: &Stage, path: impl Into<Path>, apis: &[impl AsRef<str>]) -> Result<Option<Prim>> {
let prim = stage.prim(path);
let applied = prim.api_schemas()?;
if apis.iter().any(|a| applied.iter().any(|s| s.as_str() == a.as_ref())) {
Ok(Some(prim))
} else {
Ok(None)
}
}
macro_rules! impl_token_value {
($($ty:ty),+ $(,)?) => {$(
impl From<$ty> for $crate::sdf::Value {
fn from(value: $ty) -> Self {
$crate::sdf::Value::Token(value.as_token().into())
}
}
impl TryFrom<$crate::sdf::Value> for $ty {
type Error = $crate::sdf::ValueConversionError;
fn try_from(value: $crate::sdf::Value) -> Result<Self, Self::Error> {
match &value {
$crate::sdf::Value::Token(s) => <$ty>::from_token(s.as_str()),
_ => None,
}
.ok_or_else(|| $crate::sdf::ValueConversionError::new(stringify!($ty), &value))
}
}
)+};
}
pub(crate) use impl_token_value;