use crate::*;
pub(crate) fn set_global_state(state: Arc<AppState>) -> Result<()> {
APP_STATE
.set(state)
.map_err(|_: Arc<AppState>| anyhow!("Global state already initialized"))
}
pub(crate) fn get_global_state() -> Option<Arc<AppState>> {
APP_STATE.get().cloned()
}
pub(crate) async fn generate_html(
www_dir: &Path,
import_path: &str,
is_release: bool,
custom_index_html: Option<&Path>,
) -> Result<String> {
let template_content: String = if let Some(custom_path) = custom_index_html {
let bytes: Vec<u8> = read(custom_path).await.map_err(|error: io::Error| {
anyhow!(
"Failed to read custom index.html '{}': {}",
custom_path.display(),
error
)
})?;
String::from_utf8(bytes)
.map_err(|error| anyhow!("Custom index.html is not valid UTF-8: {}", error))?
} else if is_release {
INDEX_HTML_RELEASE.to_string()
} else {
INDEX_HTML_DEV.to_string()
};
let html: String = template_content
.replace(IMPORT_PATH_PLACEHOLDER, import_path)
.replace(RELOAD_ROUTE_PLACEHOLDER, RELOAD_ROUTE);
let index_path: PathBuf = www_dir.join(INDEX_HTML_FILE_NAME);
create_dir_all(www_dir)
.await
.map_err(|error: io::Error| anyhow!("Failed to create static directory: {}", error))?;
write(&index_path, &html)
.await
.map_err(|error: io::Error| anyhow!("Failed to write index.html: {}", error))?;
Ok(html)
}
pub(crate) async fn resolve_www_dir(www_dir: &Path) -> PathBuf {
if metadata(www_dir.join(INDEX_HTML_FILE_NAME)).await.is_ok() {
return www_dir.to_path_buf();
}
let parent_name: Option<&str> = www_dir
.file_name()
.and_then(|file_name_os_str: &ffi::OsStr| file_name_os_str.to_str());
if let Some(name) = parent_name {
let nested: PathBuf = www_dir.join(name);
if metadata(nested.join(INDEX_HTML_FILE_NAME)).await.is_ok() {
return nested;
}
}
www_dir.to_path_buf()
}
pub(crate) fn resolve_pkg_dir(args: &ModeArgs) -> PathBuf {
resolve_out_dir(args)
}