use super::NativeLib;
use crate::build_rs::BuildInfo;
use crate::gen::common;
use crate::spec::ProbeCallSpecification;
use crate::spec::ProviderInitSpecification;
use crate::spec::ProviderSpecification;
use crate::{gen::CodeGenerator, TracersResult};
use proc_macro2::TokenStream;
use std::io::Write;
use std::path::{Path, PathBuf};
mod probe_call;
mod provider_trait;
pub(crate) struct DynamicGenerator {
build_info: BuildInfo,
}
impl DynamicGenerator {
pub fn new(build_info: BuildInfo) -> DynamicGenerator {
DynamicGenerator { build_info }
}
}
impl CodeGenerator for DynamicGenerator {
fn handle_provider_trait(&self, provider: ProviderSpecification) -> TracersResult<TokenStream> {
let generator = provider_trait::ProviderTraitGenerator::new(&self.build_info, provider);
generator.generate()
}
fn handle_probe_call(&self, call: ProbeCallSpecification) -> TracersResult<TokenStream> {
probe_call::generate_probe_call(call)
}
fn handle_init_provider(&self, init: ProviderInitSpecification) -> TracersResult<TokenStream> {
common::generate_init_provider(init)
}
fn generate_native_code(
&self,
stdout: &mut dyn Write,
_manifest_dir: &Path,
_out_dir: &Path,
_package_name: &str,
_targets: Vec<PathBuf>,
) -> Vec<NativeLib> {
let _ = writeln!(
stdout,
"dynamic generator doesn't require any build.rs code generation"
);
vec![]
}
}