use crate::core::config::{Language, ResolvedCrateConfig};
use std::path::PathBuf;
pub(super) fn readme_output_path(
config: &ResolvedCrateConfig,
lang: Language,
readme_cfg: &crate::core::config::ReadmeConfig,
lang_json: &serde_json::Value,
) -> PathBuf {
configured_output_path(readme_cfg, lang, lang_json).unwrap_or_else(|| default_readme_path(config, lang))
}
pub(super) fn configured_output_path(
readme_cfg: &crate::core::config::ReadmeConfig,
lang: Language,
lang_json: &serde_json::Value,
) -> Option<PathBuf> {
if let Some(output) = lang_json
.get("output_path")
.or_else(|| lang_json.get("output"))
.and_then(|v| v.as_str())
{
return Some(PathBuf::from(output));
}
readme_cfg
.output_pattern
.as_ref()
.map(|pattern| PathBuf::from(pattern.replace("{language}", lang_dir_name(lang))))
}
pub(super) fn readme_target_output_path(target_name: &str, target_json: &serde_json::Value) -> anyhow::Result<PathBuf> {
target_json
.get("output_path")
.or_else(|| target_json.get("output"))
.and_then(|v| v.as_str())
.map(PathBuf::from)
.ok_or_else(|| anyhow::anyhow!("README target '{target_name}' requires `output_path` or `output`"))
}
pub(super) fn crate_readme_path(config: &ResolvedCrateConfig, lang: Language) -> Option<PathBuf> {
let crate_dir = match lang {
Language::Ffi => config.ffi_crate_relative_dir(),
Language::Node | Language::Wasm => config.package_dir(lang),
Language::Rust => format!("crates/{}", config.core_crate_dir()),
_ => return None,
};
Some(PathBuf::from(format!("{crate_dir}/README.md")))
}
pub(super) fn default_readme_path(config: &ResolvedCrateConfig, lang: Language) -> PathBuf {
crate_readme_path(config, lang)
.unwrap_or_else(|| PathBuf::from(format!("packages/{}/README.md", lang_dir_name(lang))))
}
pub(super) fn lang_dir_name(lang: Language) -> &'static str {
match lang {
Language::Python => "python",
Language::Node => "node",
Language::Ruby => "ruby",
Language::Php => "php",
Language::Elixir => "elixir",
Language::Go => "go",
Language::Java => "java",
Language::Csharp => "csharp",
Language::Ffi => "ffi",
Language::Wasm => "wasm",
Language::R => "r",
Language::Rust => "rust",
Language::Kotlin => "kotlin",
Language::KotlinAndroid => "kotlin-android",
Language::Swift => "swift",
Language::Dart => "dart",
Language::Gleam => "gleam",
Language::Zig => "zig",
Language::C | Language::Jni => "c",
}
}
pub(super) fn lang_code(lang: Language) -> &'static str {
match lang {
Language::Python => "python",
Language::Node => "typescript",
Language::Ruby => "ruby",
Language::Php => "php",
Language::Elixir => "elixir",
Language::Go => "go",
Language::Java => "java",
Language::Csharp => "csharp",
Language::Ffi => "ffi",
Language::Wasm => "wasm",
Language::R => "r",
Language::Rust => "rust",
Language::Kotlin => "kotlin",
Language::KotlinAndroid => "kotlin_android",
Language::Swift => "swift",
Language::Dart => "dart",
Language::Gleam => "gleam",
Language::Zig => "zig",
Language::C | Language::Jni => "c",
}
}