#![doc = include_str!("../README.md")]
use std::{path::PathBuf, process::Command};
use proc_macro::{TokenStream, TokenTree};
#[proc_macro]
pub fn export_coda(tokens: TokenStream) -> TokenStream {
let coda_path = parse_token_string(tokens);
let workspace_toml = Command::new(env!("CARGO"))
.arg("locate-project")
.arg("--workspace")
.arg("--message-format=plain")
.output()
.unwrap()
.stdout;
let workspace_toml = String::from_utf8_lossy(&workspace_toml);
let workspace_root = PathBuf::from(workspace_toml.trim());
let workspace_root = workspace_root.parent().unwrap();
let path = workspace_root.join(coda_path);
let coda = std::fs::read_to_string(path.clone()).unwrap();
let coda = codas::parse::parse(&coda).unwrap();
let mut codegen = vec![];
codas::langs::rust::generate_types(&coda, &mut codegen).unwrap();
let codegen = String::from_utf8_lossy(&codegen);
let mut codegen_prefix = format!(
r#"
const _: &str = include_str!("{}");
"#,
path.display()
);
codegen_prefix += &codegen;
codegen_prefix.parse().unwrap()
}
fn parse_token_string(tokens: TokenStream) -> String {
let mut coda = match tokens.into_iter().next() {
Some(TokenTree::Literal(string)) => string.to_string(),
_ => panic!("rly?"),
};
if coda.starts_with("r#") {
coda.remove(0); coda.remove(0); coda.remove(coda.as_bytes().len() - 1); }
coda.remove(0);
coda.remove(coda.as_bytes().len() - 1);
coda
}