1use crate::*;
2
3pub fn set_global_state(state: Arc<AppState>) -> Result<(), EuvError> {
13 APP_STATE.set(state).map_err(|_: Arc<AppState>| {
14 EuvError::Message(String::from("Global state already initialized"))
15 })
16}
17
18pub fn get_global_state() -> Option<Arc<AppState>> {
24 APP_STATE.get().cloned()
25}
26
27pub async fn generate_html(
44 www_dir: &Path,
45 import_path: &str,
46 is_release: bool,
47 custom_index_html: &Option<PathBuf>,
48) -> Result<String, EuvError> {
49 let template_content: String = if let Some(custom_path) = custom_index_html {
50 let bytes: Vec<u8> =
51 read(custom_path)
52 .await
53 .map_err(|error: io::Error| EuvError::IoPath {
54 message: String::from("Failed to read custom index.html"),
55 path: custom_path.to_path_buf(),
56 error,
57 })?;
58 String::from_utf8(bytes).map_err(|error: std::string::FromUtf8Error| EuvError::Utf8 {
59 message: String::from("Custom index.html is not valid UTF-8"),
60 error,
61 })?
62 } else if is_release {
63 INDEX_HTML_RELEASE.to_string()
64 } else {
65 INDEX_HTML_DEV.to_string()
66 };
67 let html: String = template_content
68 .replace(IMPORT_PATH_PLACEHOLDER, import_path)
69 .replace(RELOAD_ROUTE_PLACEHOLDER, RELOAD_ROUTE);
70 let index_path: PathBuf = www_dir.join(INDEX_HTML_FILE_NAME);
71 create_dir_all(www_dir)
72 .await
73 .map_err(|error: io::Error| EuvError::Io {
74 message: String::from("Failed to create static directory"),
75 error,
76 })?;
77 write(&index_path, &html)
78 .await
79 .map_err(|error: io::Error| EuvError::Io {
80 message: String::from("Failed to write index.html"),
81 error,
82 })?;
83 Ok(html)
84}
85
86pub async fn resolve_www_dir(www_dir: &Path) -> PathBuf {
96 if metadata(www_dir.join(INDEX_HTML_FILE_NAME)).await.is_ok() {
97 return www_dir.to_path_buf();
98 }
99 let parent_name: Option<&str> = www_dir
100 .file_name()
101 .and_then(|file_name_os_str: &ffi::OsStr| file_name_os_str.to_str());
102 if let Some(name) = parent_name {
103 let nested: PathBuf = www_dir.join(name);
104 if metadata(nested.join(INDEX_HTML_FILE_NAME)).await.is_ok() {
105 return nested;
106 }
107 }
108 www_dir.to_path_buf()
109}
110
111pub fn resolve_pkg_dir(args: &ModeArgs) -> PathBuf {
124 resolve_out_dir(args)
125}