use std::path::PathBuf;
use specta::{ResolvedTypes, Type, Types, datatype::NamedDataType};
use specta_typescript::{Exporter, JSDoc, Layout, Typescript, primitives};
use specta_util::selection;
#[derive(Type)]
pub struct One {
a: String,
b: testing::Testing,
}
mod testing {
use super::*;
#[derive(Type)]
pub struct Testing {
c: char,
another: AnotherNestedOne,
#[specta(inline)]
inlined: AnotherNestedOne,
}
#[derive(Type)]
pub struct AnotherNestedOne {
d: i8,
e: inside_testing::InsideType,
f: another_inside_testing::AnotherInsideType,
}
mod inside_testing {
use specta::Type;
#[derive(Type)]
pub struct InsideType {
d: i8,
}
}
mod another_inside_testing {
use specta::Type;
#[derive(Type)]
pub struct AnotherInsideType {
d: i8,
}
}
}
#[derive(Type)]
pub struct MyChannel;
#[derive(Type)]
pub struct RecursiveMe {
testing: Vec<RecursiveMe>,
inlined_container: InlinedContainer,
inlined_container2: InlinedContainer,
}
#[derive(Type)]
#[specta(inline)]
pub struct InlinedContainer {
a: String,
b: i32,
#[specta(inline)]
inline_in_inlined: AnotherOne,
}
#[derive(Type)]
pub struct AnotherOne {
abc: String,
}
fn main() {
let mut types = Types::default()
.register::<One>()
.register::<MyChannel>()
.register::<RecursiveMe>();
NamedDataType::new("VirtualOne", vec![], i32::definition(&mut types)).register(&mut types);
let mut ndt = NamedDataType::new("VirtualTwo", vec![], i32::definition(&mut types));
ndt.set_module_path("".into());
ndt.register(&mut types);
let r = ndt.reference(vec![]);
let mut virtual_three = NamedDataType::new("VirtualThree", vec![], r.into());
virtual_three.set_module_path("".into());
virtual_three.register(&mut types);
let mut ndt = NamedDataType::new_inline("AnotherOne", vec![], i32::definition(&mut types));
ndt.set_module_path("dontcreateme".into());
ndt.register(&mut types);
{
}
let dt = One::definition(&mut types);
let resolved_types = ResolvedTypes::from_resolved_types(types);
let base = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("out");
std::fs::create_dir_all(&base).unwrap();
{
let exporter = Exporter::from(Typescript::default());
let exporter = exporter.framework_runtime(move |exporter| {
Ok(format!(
"// Runtime\nexport function testing(_: {}) {{}}",
exporter.inline(&dt)?
)
.into())
});
exporter
.export_to(base.join("framework.ts"), &resolved_types)
.unwrap();
exporter
.clone()
.layout(Layout::ModulePrefixedName)
.export_to(base.join("framework-prefixed.ts"), &resolved_types)
.unwrap();
exporter
.clone()
.layout(Layout::Namespaces)
.export_to(base.join("framework-namespaces.ts"), &resolved_types)
.unwrap();
exporter
.layout(Layout::Files)
.export_to(base.join("framework-output"), &resolved_types)
.unwrap();
}
{
let exporter = Exporter::from(JSDoc::default());
exporter
.clone()
.layout(Layout::Files)
.export_to(base.join("framework-output-js"), &resolved_types)
.unwrap();
exporter
.clone()
.export_to(base.join("framework.js"), &resolved_types)
.unwrap();
exporter
.clone()
.layout(Layout::ModulePrefixedName)
.export_to(base.join("framework-prefixed.js"), &resolved_types)
.unwrap();
}
}