use crate::errors::*;
use std::fs;
use std::path::PathBuf;
macro_rules! copy_dir {
($from:expr, $to:expr, $err:ident) => {{
let from = &$from;
let to = &$to;
if let Err(err) = fs_extra::dir::copy(&from, &to, &fs_extra::dir::CopyOptions::new()) {
return Err(BuildError::$err {
to: to.to_str().map(|s| s.to_string()).unwrap(),
from: from.to_str().map(|s| s.to_string()).unwrap(),
source: err,
}
.into());
}
}};
}
pub async fn build(dir: PathBuf) -> Result<i32, BuildError> {
let dir = dir.join(".tribble");
match tribble_app::export().await {
Ok(()) => (),
Err(err) => return Err(BuildError::ExportFailed { source: err }),
};
copy_dir!(dir.join("perseus/exported"), dir, CopyOutputFailed);
let from = dir.join("exported");
let to = dir.join("dist");
if let Err(err) = fs::rename(&from, &to) {
return Err(BuildError::RenameOutputFailed {
to: to.to_str().map(|s| s.to_string()).unwrap(),
from: from.to_str().map(|s| s.to_string()).unwrap(),
source: err,
});
}
copy_dir!(
dir.join("utils/static"),
dir.join("dist/.perseus"),
CopyStaticFailed
);
let from = dir.join("utils/bundle.wasm");
let to = dir.join("dist/.perseus/bundle.wasm");
if let Err(err) = fs::copy(&from, &to) {
return Err(BuildError::CopyWasmBundleFailed {
to: to.to_str().map(|s| s.to_string()).unwrap(),
from: from.to_str().map(|s| s.to_string()).unwrap(),
source: err,
});
}
let from = dir.join("utils/bundle.js");
let to = dir.join("dist/.perseus/bundle.js");
if let Err(err) = fs::copy(&from, &to) {
return Err(BuildError::CopyJsBundleFailed {
to: to.to_str().map(|s| s.to_string()).unwrap(),
from: from.to_str().map(|s| s.to_string()).unwrap(),
source: err,
});
}
Ok(0)
}