aboutsummaryrefslogtreecommitdiff
path: root/bundle/src-tauri/src/compiler.rs
diff options
context:
space:
mode:
Diffstat (limited to 'bundle/src-tauri/src/compiler.rs')
-rw-r--r--bundle/src-tauri/src/compiler.rs41
1 files changed, 41 insertions, 0 deletions
diff --git a/bundle/src-tauri/src/compiler.rs b/bundle/src-tauri/src/compiler.rs
new file mode 100644
index 0000000..275a707
--- /dev/null
+++ b/bundle/src-tauri/src/compiler.rs
@@ -0,0 +1,41 @@
+use std::path::PathBuf;
+
+// Keep startup failures available to the UI, including an unwritable working directory.
+pub struct Compiler(pub Result<PathBuf, String>);
+
+impl Compiler {
+ pub fn load() -> Self {
+ Self(executable().map_err(|error| format!("Cannot load compiler: {error}")))
+ }
+}
+
+#[cfg(not(windows))]
+fn executable() -> std::io::Result<PathBuf> {
+ Ok(std::env::current_exe()?.with_file_name("cpsc"))
+}
+
+#[cfg(windows)]
+fn executable() -> std::io::Result<PathBuf> {
+ use std::{
+ fs::{self, File},
+ io,
+ };
+
+ let directory = std::env::current_dir()?;
+ let destination = directory.join("cpsc.exe");
+ let staged = directory.join(format!(".cpsc-{}.tmp", std::process::id()));
+ let result = (|| {
+ let mut compressed = flate2::read::GzDecoder::new(
+ &include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/binaries/cpsc.exe.gz"))[..],
+ );
+ let mut file = File::create(&staged)?;
+ io::copy(&mut compressed, &mut file)?;
+ drop(file);
+ fs::rename(&staged, &destination)?;
+ Ok(destination)
+ })();
+ if result.is_err() {
+ let _ = fs::remove_file(staged);
+ }
+ result
+}