device_driver_generation/
lib.rs#![doc = include_str!(concat!("../", env!("CARGO_PKG_README")))]
#[cfg(feature = "dsl")]
mod dsl_hir;
mod lir;
#[cfg(feature = "manifest")]
mod manifest;
mod mir;
#[cfg(feature = "dsl")]
pub fn transform_dsl(
input: proc_macro2::TokenStream,
driver_name: &str,
) -> proc_macro2::TokenStream {
let mir = match _private_transform_dsl_mir(input) {
Ok(mir) => mir,
Err(e) => return e.into_compile_error(),
};
transform_mir(mir, driver_name)
}
#[doc(hidden)]
#[cfg(feature = "dsl")]
pub fn _private_transform_dsl_mir(
input: proc_macro2::TokenStream,
) -> Result<mir::Device, syn::Error> {
let hir = syn::parse2::<dsl_hir::Device>(input)?;
let mir = dsl_hir::mir_transform::transform(hir)?;
Ok(mir)
}
#[cfg(feature = "json")]
pub fn transform_json(source: &str, driver_name: &str) -> proc_macro2::TokenStream {
let mir = match _private_transform_json_mir(source) {
Ok(mir) => mir,
Err(e) => return anyhow_error_to_compile_error(e),
};
transform_mir(mir, driver_name)
}
#[doc(hidden)]
#[cfg(feature = "json")]
pub fn _private_transform_json_mir(source: &str) -> anyhow::Result<mir::Device> {
let value = dd_manifest_tree::parse_manifest::<dd_manifest_tree::JsonValue>(source)?;
let mir = manifest::transform(value)?;
Ok(mir)
}
#[cfg(feature = "yaml")]
pub fn transform_yaml(source: &str, driver_name: &str) -> proc_macro2::TokenStream {
let mir = match _private_transform_yaml_mir(source) {
Ok(mir) => mir,
Err(e) => return anyhow_error_to_compile_error(e),
};
transform_mir(mir, driver_name)
}
#[doc(hidden)]
#[cfg(feature = "yaml")]
pub fn _private_transform_yaml_mir(source: &str) -> anyhow::Result<mir::Device> {
let value = dd_manifest_tree::parse_manifest::<dd_manifest_tree::YamlValue>(source)?;
let mir = manifest::transform(value)?;
Ok(mir)
}
#[cfg(feature = "toml")]
pub fn transform_toml(source: &str, driver_name: &str) -> proc_macro2::TokenStream {
let mir = match _private_transform_toml_mir(source) {
Ok(mir) => mir,
Err(e) => return anyhow_error_to_compile_error(e),
};
transform_mir(mir, driver_name)
}
#[doc(hidden)]
#[cfg(feature = "toml")]
pub fn _private_transform_toml_mir(source: &str) -> anyhow::Result<mir::Device> {
let value = dd_manifest_tree::parse_manifest::<dd_manifest_tree::TomlValue>(source)?;
let mir = manifest::transform(value)?;
Ok(mir)
}
fn transform_mir(mut mir: mir::Device, driver_name: &str) -> proc_macro2::TokenStream {
match mir::passes::run_passes(&mut mir) {
Ok(()) => {}
Err(e) => return anyhow_error_to_compile_error(e),
}
let mut lir = match mir::lir_transform::transform(mir, driver_name) {
Ok(lir) => lir,
Err(e) => return anyhow_error_to_compile_error(e),
};
match lir::passes::run_passes(&mut lir) {
Ok(()) => {}
Err(e) => return anyhow_error_to_compile_error(e),
};
lir::token_transform::transform(lir)
}
fn anyhow_error_to_compile_error(error: anyhow::Error) -> proc_macro2::TokenStream {
syn::Error::new(proc_macro2::Span::call_site(), format!("{error:#}")).into_compile_error()
}