use crate::config::{Language, ResolvedCrateConfig};
use crate::ir::ApiSurface;
use std::path::PathBuf;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum BuildDependency {
#[default]
None,
Ffi,
Rustler,
}
#[derive(Debug, Clone)]
pub struct BuildConfig {
pub tool: &'static str,
pub crate_suffix: &'static str,
pub build_dep: BuildDependency,
pub post_build: Vec<PostBuildStep>,
}
impl BuildConfig {
pub fn depends_on_ffi(&self) -> bool {
matches!(self.build_dep, BuildDependency::Ffi)
}
}
#[derive(Debug, Clone)]
pub enum PostBuildStep {
PatchFile {
path: &'static str,
find: &'static str,
replace: &'static str,
},
RunCommand {
cmd: &'static str,
args: Vec<&'static str>,
},
}
#[derive(Debug, Clone)]
pub struct GeneratedFile {
pub path: PathBuf,
pub content: String,
pub generated_header: bool,
}
#[derive(Debug, Clone, Default)]
pub struct Capabilities {
pub supports_async: bool,
pub supports_classes: bool,
pub supports_enums: bool,
pub supports_option: bool,
pub supports_result: bool,
pub supports_callbacks: bool,
pub supports_streaming: bool,
}
pub trait Backend: Send + Sync {
fn name(&self) -> &str;
fn language(&self) -> Language;
fn capabilities(&self) -> Capabilities;
fn generate_bindings(&self, api: &ApiSurface, config: &ResolvedCrateConfig) -> anyhow::Result<Vec<GeneratedFile>>;
fn generate_type_stubs(
&self,
_api: &ApiSurface,
_config: &ResolvedCrateConfig,
) -> anyhow::Result<Vec<GeneratedFile>> {
Ok(vec![])
}
fn generate_scaffold(
&self,
_api: &ApiSurface,
_config: &ResolvedCrateConfig,
) -> anyhow::Result<Vec<GeneratedFile>> {
Ok(vec![])
}
fn generate_public_api(
&self,
_api: &ApiSurface,
_config: &ResolvedCrateConfig,
) -> anyhow::Result<Vec<GeneratedFile>> {
Ok(vec![])
}
fn build_config(&self) -> Option<BuildConfig> {
None
}
}