use crate::{Settings, discovery::CatalogSources};
use proc_macro2::TokenStream;
use quote::quote;
use std::path::Path;
pub(super) fn render(
settings: &Settings,
sources: &CatalogSources,
config_path: &Path,
) -> Result<TokenStream, String> {
let asset_root = settings
.asset_root
.to_str()
.ok_or("asset-root must be UTF-8")?;
let catalog = settings.catalog.to_str().ok_or("catalog must be UTF-8")?;
let default_language = &sources.configuration.default_language;
let source_language = &sources.configuration.source_language;
let languages_directory = sources
.configuration
.languages_directory
.to_str()
.ok_or("translations-directory must be UTF-8")?;
let configuration = config_path.to_str().ok_or("catalog path must be UTF-8")?;
let mut modules = Vec::new();
for module in &sources.modules {
let language = &module.language;
let path = &module.path;
modules.push(quote!((#language, #path)));
}
Ok(quote! {
pub const ASSET_ROOT: &str = #asset_root;
pub const CATALOG_ASSET_PATH: &str = #catalog;
pub const DEFAULT_LANGUAGE: &str = #default_language;
pub const SOURCE_LANGUAGE: &str = #source_language;
pub const LANGUAGES_DIRECTORY: &str = #languages_directory;
pub const CATALOG_CONFIG: &str = include_str!(#configuration);
pub const MODULES: &[(&str, &str)] = &[#(#modules,)*];
})
}