use specta::{datatype::LiteralType, ts, DataType, DataTypeFrom, ObjectType, TupleType};
#[derive(Clone, DataTypeFrom)]
pub struct MyEnum(pub Vec<DataType>);
#[derive(Clone, DataTypeFrom)]
pub struct MyObject {
a: Vec<DataType>,
}
fn main() {
let val: TupleType = MyEnum(vec![
LiteralType::String("A".to_string()).into(),
LiteralType::String("B".to_string()).into(),
])
.into();
let anon = val.clone().to_anonymous();
let named = val.to_named("MyEnum");
let anon = ts::datatype(&Default::default(), &anon).unwrap();
let named_export = ts::export_datatype(&Default::default(), &named).unwrap();
println!("anonymous enum: {anon}");
println!("named enum export: {named_export}");
assert_eq!(anon, "\"A\" | \"B\"");
assert_eq!(named_export, "export type MyEnum = \"A\" | \"B\"");
let val: ObjectType = MyObject {
a: vec![
LiteralType::String("A".to_string()).into(),
LiteralType::String("B".to_string()).into(),
],
}
.into();
let anon = val.clone().to_anonymous();
let named = val.to_named("MyObject");
let anon = ts::datatype(&Default::default(), &anon).unwrap();
let named_export = ts::export_datatype(&Default::default(), &named).unwrap();
println!("anonymous object: {anon}");
println!("named object export: {named_export}");
assert_eq!(anon, "{ a: \"A\" | \"B\" }");
assert_eq!(named_export, "export type MyObject = { a: \"A\" | \"B\" }");
}