#![warn(missing_docs)]
mod alias;
mod metadata;
mod output;
mod registry;
mod type_id;
pub mod types;
pub use alias::TypeAlias;
pub use metadata::TypeMetadata;
pub use output::{GoType, TypeScriptType};
pub use registry::TypeRegistry;
pub use type_id::TypeId;
pub use go_away_derive::TypeMetadata;
use registry::Type;
use std::fmt::Display;
pub fn registry_to_output<'a, Format>(registry: &'a TypeRegistry) -> String
where
Format: From<&'a Type> + Display,
{
use std::fmt::Write;
let mut output = String::new();
for id in registry.structs.iter().rev() {
let ty = registry.types.get(id).unwrap();
write!(&mut output, "{}", Format::from(ty)).unwrap();
}
for id in registry.unions.iter().rev() {
let ty = registry.types.get(id).unwrap();
write!(&mut output, "{}", Format::from(ty)).unwrap();
}
for id in registry.newtypes.iter().rev() {
let ty = registry.types.get(id).unwrap();
write!(&mut output, "{}", Format::from(ty)).unwrap();
}
for id in registry.enums.iter().rev() {
let ty = registry.types.get(id).unwrap();
write!(&mut output, "{}", Format::from(ty)).unwrap();
}
for id in registry.aliases.iter().rev() {
let ty = registry.types.get(id).unwrap();
write!(&mut output, "{}", Format::from(ty)).unwrap();
}
output
}
impl<'a> From<&'a registry::Type> for output::go::GoType<'a> {
fn from(ty: &'a registry::Type) -> Self {
match ty {
registry::Type::Struct(inner) => output::go::GoType::Struct(inner),
registry::Type::Enum(inner) => output::go::GoType::Enum(inner),
registry::Type::Union(inner) => output::go::GoType::Union(inner),
registry::Type::NewType(inner) => output::go::GoType::NewType(inner),
registry::Type::Alias(inner) => output::go::GoType::Alias(inner),
}
}
}
impl<'a> From<&'a registry::Type> for output::typescript::TypeScriptType<'a> {
fn from(ty: &'a registry::Type) -> Self {
match ty {
registry::Type::Struct(inner) => output::typescript::TypeScriptType::Struct(inner),
registry::Type::Enum(inner) => output::typescript::TypeScriptType::Enum(inner),
registry::Type::Union(inner) => output::typescript::TypeScriptType::Union(inner),
registry::Type::NewType(inner) => output::typescript::TypeScriptType::NewType(inner),
registry::Type::Alias(inner) => output::typescript::TypeScriptType::Alias(inner),
}
}
}