use crate::core::config::{ResolvedCrateConfig, resolve_output_dir};
const DEFAULT_SPLIT_LAYOUT_CLASS_DIR: &str = "packages/php/src/";
pub fn php_class_output_dir(config: &ResolvedCrateConfig) -> String {
config
.php
.as_ref()
.and_then(|php| php.stubs.as_ref())
.map(|stubs| stubs.output.to_string_lossy().into_owned())
.unwrap_or_else(|| {
resolve_output_dir(
config.output_paths.get("php"),
&config.name,
DEFAULT_SPLIT_LAYOUT_CLASS_DIR,
)
})
}
pub fn php_psr4_target(config: &ResolvedCrateConfig) -> String {
format!("{}/", php_class_output_dir(config).trim_end_matches('/'))
}
pub fn php_package_psr4_target(config: &ResolvedCrateConfig, pkg_dir: &str) -> Option<String> {
let class_dir = php_class_output_dir(config);
let class_dir = class_dir.trim_end_matches('/');
let pkg_dir = pkg_dir.trim_end_matches('/');
let relative = class_dir.strip_prefix(pkg_dir)?.strip_prefix('/')?;
Some(format!("{relative}/"))
}
#[cfg(test)]
mod tests {
use super::*;
use crate::core::config::NewAlefConfig;
fn resolve(toml_text: &str) -> ResolvedCrateConfig {
let cfg: NewAlefConfig = toml::from_str(toml_text).expect("valid config");
cfg.resolve().expect("resolve").remove(0)
}
#[test]
fn unconfigured_php_output_resolves_to_the_co_located_binding_crate() {
let config = resolve(
r#"
[workspace]
languages = ["php"]
[[crates]]
name = "my-lib"
sources = []
"#,
);
assert_eq!(php_class_output_dir(&config), "crates/my-lib-php/src");
assert_eq!(php_psr4_target(&config), "crates/my-lib-php/src/");
}
#[test]
fn php_disabled_falls_back_to_the_split_layout_class_directory() {
let config = resolve(
r#"
[workspace]
languages = ["python"]
[[crates]]
name = "my-lib"
sources = []
"#,
);
assert_eq!(php_psr4_target(&config), "packages/php/src/");
}
#[test]
fn configured_output_without_a_src_segment_is_used_verbatim() {
let config = resolve(
r#"
[workspace]
languages = ["php"]
[[crates]]
name = "my-lib"
sources = []
[crates.output]
php = "packages/php"
"#,
);
assert_eq!(php_psr4_target(&config), "packages/php/");
}
#[test]
fn stubs_output_wins_over_the_resolved_output_path() {
let config = resolve(
r#"
[workspace]
languages = ["php"]
[[crates]]
name = "my-lib"
sources = []
[crates.output]
php = "packages/php"
[crates.php.stubs]
output = "src/php-classes"
"#,
);
assert_eq!(php_psr4_target(&config), "src/php-classes/");
}
#[test]
fn a_trailing_slash_is_never_doubled() {
let config = resolve(
r#"
[workspace]
languages = ["php"]
[[crates]]
name = "my-lib"
sources = []
[crates.output]
php = "crates/my-lib-php/src/"
"#,
);
assert_eq!(php_psr4_target(&config), "crates/my-lib-php/src/");
}
#[test]
fn package_psr4_target_is_the_class_dir_relative_to_pkg_dir() {
let config = resolve(
r#"
[workspace]
languages = ["php"]
[[crates]]
name = "my-lib"
sources = []
[crates.output]
php = "packages/php"
[crates.php.stubs]
output = "packages/php/generated"
"#,
);
assert_eq!(
php_package_psr4_target(&config, "packages/php"),
Some("generated/".to_string())
);
}
#[test]
fn package_psr4_target_is_none_when_class_dir_equals_pkg_dir() {
let config = resolve(
r#"
[workspace]
languages = ["php"]
[[crates]]
name = "my-lib"
sources = []
[crates.output]
php = "packages/php"
"#,
);
assert_eq!(php_package_psr4_target(&config, "packages/php"), None);
}
#[test]
fn package_psr4_target_is_none_when_class_dir_is_outside_pkg_dir() {
let config = resolve(
r#"
[workspace]
languages = ["php"]
[[crates]]
name = "my-lib"
sources = []
"#,
);
assert_eq!(php_package_psr4_target(&config, "packages/php"), None);
}
}