use std::marker::PhantomData;
pub use struct_reflection_derive::StructReflection;
pub trait StructReflection {
fn struct_reflection() -> Option<Vec<String>>;
}
pub trait StructReflectionHelper {
fn struct_reflection() -> Option<Vec<String>>;
}
impl<T: StructReflection> StructReflectionHelper for T {
fn struct_reflection() -> Option<Vec<String>> {
T::struct_reflection()
}
}
impl<T: StructReflectionHelper, const N: usize> StructReflectionHelper for [T; N] {
fn struct_reflection() -> Option<Vec<String>> {
match T::struct_reflection() {
Some(inner_fields) => {
let mut fields = Vec::new();
for i in 0..N {
for field in &inner_fields {
fields.push(format!("{i}__{field}"));
}
}
Some(fields)
}
None => Some((0..N).map(|i| i.to_string()).collect()),
}
}
}
impl<T> StructReflectionHelper for Option<T> {
fn struct_reflection() -> Option<Vec<String>> {
Some(vec!["optional".to_string()])
}
}
impl<T> StructReflectionHelper for PhantomData<T> {
fn struct_reflection() -> Option<Vec<String>> {
None
}
}