use crate::build_rs::BuildInfo;
use crate::error::TracersResult;
use crate::spec::{ProbeCallSpecification, ProviderInitSpecification, ProviderSpecification};
use crate::TracingType;
use proc_macro2::TokenStream;
use serde::{Deserialize, Serialize};
use std::io::Write;
use std::path::{Path, PathBuf};
pub(crate) mod common;
pub(crate) mod dynamic;
pub(crate) mod r#static;
#[derive(Serialize, Deserialize, Debug, PartialEq, PartialOrd)]
pub(crate) enum NativeLib {
StaticWrapperLib(String),
StaticWrapperLibPath(PathBuf),
DynamicSupportLib(String),
StaticSupportLib(String),
SupportLibPath(PathBuf),
}
pub(crate) trait CodeGenerator {
fn handle_provider_trait(&self, provider: ProviderSpecification) -> TracersResult<TokenStream>;
fn handle_probe_call(&self, call: ProbeCallSpecification) -> TracersResult<TokenStream>;
fn handle_init_provider(&self, init: ProviderInitSpecification) -> TracersResult<TokenStream>;
fn generate_native_code(
&self,
stdout: &mut dyn Write,
manifest_dir: &Path,
out_dir: &Path,
package_name: &str,
targets: Vec<PathBuf>,
) -> Vec<NativeLib>;
}
pub(crate) fn code_generator() -> TracersResult<Box<dyn CodeGenerator>> {
let bi = BuildInfo::load()?;
Ok(match bi.implementation.tracing_type() {
TracingType::Disabled | TracingType::Static => Box::new(r#static::StaticGenerator::new(bi)),
TracingType::Dynamic => Box::new(dynamic::DynamicGenerator::new(bi)),
})
}