mod helpers;
mod php;
mod rust;
mod type_mapping;
#[cfg(test)]
mod tests;
use crate::core::backend::GeneratedFile;
use crate::core::config::ResolvedCrateConfig;
use crate::core::ir::ApiSurface;
use std::path::PathBuf;
pub(super) use php::gen_service_php;
pub(super) use rust::gen_service_rs;
pub fn generate(api: &ApiSurface, config: &ResolvedCrateConfig) -> anyhow::Result<Vec<GeneratedFile>> {
if api.services.is_empty() {
return Ok(vec![]);
}
use crate::core::config::resolve_output_dir;
let output_dir = resolve_output_dir(config.output_paths.get("php"), &config.name, "crates/{name}-php/src/");
let service_rs = gen_service_rs(api, config);
let extension_name = config.name.replace('-', "_");
let service_php = gen_service_php(api, &extension_name);
let output_base = config
.php
.as_ref()
.and_then(|p| p.stubs.as_ref())
.map(|s| PathBuf::from(&s.output))
.unwrap_or_else(|| {
let package_name = config.name.replace('-', "_");
PathBuf::from(format!("packages/php/{}", package_name))
});
Ok(vec![
GeneratedFile {
path: PathBuf::from(&output_dir).join("service.rs"),
content: service_rs,
generated_header: true,
},
GeneratedFile {
path: output_base.join("Service.php"),
content: service_php,
generated_header: true,
},
])
}