aboutsummaryrefslogtreecommitdiff
path: root/mingling/src/res/dirs/current_exe.rs
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-06-27 18:52:49 +0800
committer魏曹先生 <1992414357@qq.com>2026-06-27 18:52:49 +0800
commit353fdc5b539aae0479c7404d0ed6404f82bf633a (patch)
tree0f0f07080aebf2ad8f0be537c7bc855618d89df6 /mingling/src/res/dirs/current_exe.rs
parent5a23e6b3ad655b15b412720ab81b0508866bebce (diff)
feat(mingling): add directory environment resources and setup
Add four new resource types for common directory paths and a convenience setup struct that registers all of them at once.
Diffstat (limited to 'mingling/src/res/dirs/current_exe.rs')
-rw-r--r--mingling/src/res/dirs/current_exe.rs81
1 files changed, 81 insertions, 0 deletions
diff --git a/mingling/src/res/dirs/current_exe.rs b/mingling/src/res/dirs/current_exe.rs
new file mode 100644
index 0000000..051fcee
--- /dev/null
+++ b/mingling/src/res/dirs/current_exe.rs
@@ -0,0 +1,81 @@
+use std::{
+ env::current_exe,
+ path::{Path, PathBuf},
+};
+
+/// A global resource that provides the path of the current executable.
+///
+/// This struct wraps a `PathBuf` representing the full filesystem path of the
+/// currently running executable at the time of creation.
+///
+/// # Default behavior
+///
+/// The `Default` implementation calls `std::env::current_exe().unwrap()` internally,
+/// which will **panic** if the executable path cannot be determined (e.g., if the
+/// `/proc` filesystem is not available). If you want to handle this error gracefully,
+/// use [`ResCurrentExe::new`] instead, which returns a `Result`.
+#[derive(Debug, Clone, PartialEq, Eq)]
+pub struct ResCurrentExe {
+ exe: PathBuf,
+}
+
+impl ResCurrentExe {
+ /// Creates a new `ResCurrentExe` by querying the OS for the current executable path.
+ ///
+ /// Returns `Err` if the executable path cannot be determined (e.g., the `/proc`
+ /// filesystem is not available on Linux, or the process handle is invalid).
+ /// Unlike the `Default` implementation, this method does not panic on failure.
+ pub fn new() -> Result<Self, std::io::Error> {
+ Ok(Self { exe: current_exe()? })
+ }
+}
+
+impl Default for ResCurrentExe {
+ fn default() -> Self {
+ Self { exe: current_exe().unwrap() }
+ }
+}
+
+impl From<PathBuf> for ResCurrentExe {
+ fn from(path: PathBuf) -> Self {
+ Self { exe: path }
+ }
+}
+
+impl From<&Path> for ResCurrentExe {
+ fn from(path: &Path) -> Self {
+ Self { exe: path.to_path_buf() }
+ }
+}
+
+impl From<&PathBuf> for ResCurrentExe {
+ fn from(path: &PathBuf) -> Self {
+ Self { exe: path.clone() }
+ }
+}
+
+impl From<ResCurrentExe> for PathBuf {
+ fn from(res: ResCurrentExe) -> Self {
+ res.exe
+ }
+}
+
+impl AsRef<Path> for ResCurrentExe {
+ fn as_ref(&self) -> &Path {
+ self.exe.as_path()
+ }
+}
+
+impl std::ops::Deref for ResCurrentExe {
+ type Target = PathBuf;
+
+ fn deref(&self) -> &Self::Target {
+ &self.exe
+ }
+}
+
+impl std::ops::DerefMut for ResCurrentExe {
+ fn deref_mut(&mut self) -> &mut Self::Target {
+ &mut self.exe
+ }
+}