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 native_code;
mod probe_call;
mod provider_trait;
pub(crate) struct StaticGenerator {
build_info: BuildInfo,
}
impl StaticGenerator {
pub fn new(build_info: BuildInfo) -> StaticGenerator {
StaticGenerator { build_info }
}
}
impl CodeGenerator for StaticGenerator {
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(&self.build_info, 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> {
if self.build_info.implementation.is_static() {
native_code::generate_native_code(
&self.build_info,
stdout,
manifest_dir,
out_dir,
package_name,
targets,
)
} else {
vec![]
}
}
}