use openusd::sdf::{self, ChildrenKey, FieldKey, SpecType, Specifier, Value};
use openusd::usda::TextWriter;
fn main() -> anyhow::Result<()> {
let out = std::env::args().nth(1).unwrap_or_else(|| "out.usda".to_string());
let mut data = sdf::Data::new();
let root = sdf::Path::abs_root();
let root_spec = data.create_spec(root.clone(), SpecType::PseudoRoot);
root_spec.add(ChildrenKey::PrimChildren, Value::TokenVec(vec!["World".into()]));
root_spec.add(FieldKey::DefaultPrim, Value::Token("World".into()));
root_spec.add(FieldKey::Documentation, Value::String("Generated by openusd".into()));
let world = sdf::path("/World")?;
let world_spec = data.create_spec(world.clone(), SpecType::Prim);
world_spec.add(FieldKey::Specifier, Value::Specifier(Specifier::Def));
world_spec.add(FieldKey::TypeName, Value::Token("Xform".into()));
world_spec.add(ChildrenKey::PrimChildren, Value::TokenVec(vec!["Sphere".into()]));
let sphere = sdf::path("/World/Sphere")?;
let sphere_spec = data.create_spec(sphere.clone(), SpecType::Prim);
sphere_spec.add(FieldKey::Specifier, Value::Specifier(Specifier::Def));
sphere_spec.add(FieldKey::TypeName, Value::Token("Sphere".into()));
sphere_spec.add(ChildrenKey::PropertyChildren, Value::TokenVec(vec!["radius".into()]));
let radius = sphere.append_property("radius")?;
let attr_spec = data.create_spec(radius, SpecType::Attribute);
attr_spec.add(FieldKey::TypeName, Value::Token("double".into()));
attr_spec.add(FieldKey::Default, Value::Double(2.5));
TextWriter::write_to_file(&data, &out)?;
println!("Wrote {} spec(s) to {out}", data.len());
Ok(())
}