use crate::sdf;
use super::{Prim, Stage};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum SchemaKind {
AbstractBase,
AbstractTyped,
ConcreteTyped,
NonAppliedApi,
SingleApplyApi,
MultipleApplyApi,
}
pub trait SchemaBase {
const KIND: SchemaKind;
fn prim(&self) -> &Prim;
fn path(&self) -> &sdf::Path {
self.prim().path()
}
fn stage(&self) -> &Stage {
self.prim().stage()
}
fn is_concrete(&self) -> bool {
matches!(Self::KIND, SchemaKind::ConcreteTyped)
}
fn is_typed(&self) -> bool {
matches!(Self::KIND, SchemaKind::AbstractTyped | SchemaKind::ConcreteTyped)
}
fn is_api_schema(&self) -> bool {
matches!(
Self::KIND,
SchemaKind::NonAppliedApi | SchemaKind::SingleApplyApi | SchemaKind::MultipleApplyApi
)
}
fn is_applied_api_schema(&self) -> bool {
matches!(Self::KIND, SchemaKind::SingleApplyApi | SchemaKind::MultipleApplyApi)
}
fn is_multiple_apply_api_schema(&self) -> bool {
matches!(Self::KIND, SchemaKind::MultipleApplyApi)
}
}
impl<T: SchemaBase> From<T> for Prim {
fn from(schema: T) -> Self {
schema.prim().clone()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::usd::Stage;
struct Marker(Prim);
impl SchemaBase for Marker {
const KIND: SchemaKind = SchemaKind::ConcreteTyped;
fn prim(&self) -> &Prim {
&self.0
}
}
#[test]
fn base_accessors() -> anyhow::Result<()> {
let stage = Stage::builder().in_memory("anon.usda")?;
let prim = stage.define_prim("/World")?;
let schema = Marker(prim);
assert_eq!(schema.path().as_str(), "/World");
assert_eq!(schema.stage().prim_at(schema.path()).type_name()?, None);
Ok(())
}
#[test]
fn into_prim_via_from() -> anyhow::Result<()> {
let stage = Stage::builder().in_memory("anon.usda")?;
let schema = Marker(stage.define_prim("/World")?);
let prim: Prim = schema.into();
assert_eq!(prim.path().as_str(), "/World");
Ok(())
}
#[test]
fn classification() {
assert_eq!(Marker::KIND, SchemaKind::ConcreteTyped);
let stage = Stage::builder().in_memory("anon.usda").unwrap();
let schema = Marker(stage.define_prim("/World").unwrap());
assert!(schema.is_concrete());
assert!(schema.is_typed());
assert!(!schema.is_api_schema());
assert!(!schema.is_applied_api_schema());
assert!(!schema.is_multiple_apply_api_schema());
}
}