use super::ResolvedCrateConfig;
impl ResolvedCrateConfig {
pub fn ffi_prefix(&self) -> String {
self.ffi
.as_ref()
.and_then(|f| f.prefix.as_ref())
.cloned()
.unwrap_or_else(|| self.name.replace('-', "_"))
}
pub fn ffi_lib_name(&self) -> String {
if let Some(name) = self.ffi.as_ref().and_then(|f| f.lib_name.as_ref()) {
return name.clone();
}
if let Some(ffi_path) = self.explicit_output.ffi.as_ref() {
let crate_dir = ffi_path
.components()
.filter_map(|c| {
if let std::path::Component::Normal(s) = c {
s.to_str()
} else {
None
}
})
.rev()
.find(|&s| s != "src" && s != "lib" && s != "include");
if let Some(dir) = crate_dir {
return dir.replace('-', "_");
}
}
format!("{}_ffi", self.ffi_prefix())
}
pub fn ffi_header_name(&self) -> String {
self.ffi
.as_ref()
.and_then(|f| f.header_name.as_ref())
.cloned()
.unwrap_or_else(|| format!("{}.h", self.ffi_prefix()))
}
}
#[cfg(test)]
mod tests {
use crate::config::new_config::NewAlefConfig;
fn resolved_one(toml: &str) -> super::super::ResolvedCrateConfig {
let cfg: NewAlefConfig = toml::from_str(toml).unwrap();
cfg.resolve().unwrap().remove(0)
}
fn minimal_ffi() -> super::super::ResolvedCrateConfig {
resolved_one(
r#"
[workspace]
languages = ["ffi"]
[[crates]]
name = "my-lib"
sources = ["src/lib.rs"]
"#,
)
}
#[test]
fn ffi_prefix_defaults_to_snake_case_name() {
let r = minimal_ffi();
assert_eq!(r.ffi_prefix(), "my_lib");
}
#[test]
fn ffi_prefix_explicit_wins() {
let r = resolved_one(
r#"
[workspace]
languages = ["ffi"]
[[crates]]
name = "my-lib"
sources = ["src/lib.rs"]
[crates.ffi]
prefix = "custom_prefix"
"#,
);
assert_eq!(r.ffi_prefix(), "custom_prefix");
}
#[test]
fn ffi_lib_name_falls_back_to_prefix_ffi() {
let r = minimal_ffi();
assert_eq!(r.ffi_lib_name(), "my_lib_ffi");
}
#[test]
fn ffi_lib_name_explicit_wins() {
let r = resolved_one(
r#"
[workspace]
languages = ["ffi"]
[[crates]]
name = "my-lib"
sources = ["src/lib.rs"]
[crates.ffi]
lib_name = "libmy_custom"
"#,
);
assert_eq!(r.ffi_lib_name(), "libmy_custom");
}
#[test]
fn ffi_header_name_defaults_to_prefix_h() {
let r = minimal_ffi();
assert_eq!(r.ffi_header_name(), "my_lib.h");
}
#[test]
fn ffi_lib_name_derives_from_explicit_output_path() {
let r = resolved_one(
r#"
[workspace]
languages = ["ffi"]
[[crates]]
name = "my-lib"
sources = ["src/lib.rs"]
[crates.output]
ffi = "crates/html-to-markdown-ffi/src/"
"#,
);
assert_eq!(r.ffi_lib_name(), "html_to_markdown_ffi");
}
#[test]
fn ffi_lib_name_explicit_lib_name_overrides_output_path_derivation() {
let r = resolved_one(
r#"
[workspace]
languages = ["ffi"]
[[crates]]
name = "my-lib"
sources = ["src/lib.rs"]
[crates.ffi]
lib_name = "explicit_wins"
[crates.output]
ffi = "crates/html-to-markdown-ffi/src/"
"#,
);
assert_eq!(r.ffi_lib_name(), "explicit_wins");
}
#[test]
fn ffi_lib_name_template_derived_output_does_not_drive_lib_name() {
let r = minimal_ffi();
assert_eq!(r.ffi_lib_name(), "my_lib_ffi");
}
#[test]
fn ffi_header_name_explicit_wins() {
let r = resolved_one(
r#"
[workspace]
languages = ["ffi"]
[[crates]]
name = "my-lib"
sources = ["src/lib.rs"]
[crates.ffi]
header_name = "custom.h"
"#,
);
assert_eq!(r.ffi_header_name(), "custom.h");
}
}