Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions phenoxtract-ui/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,12 @@
"@angular/forms": "^20.1.4",
"@angular/platform-browser": "^20.1.4",
"@angular/router": "^20.1.4",
"@primeuix/themes": "^2.0.3",
"@tauri-apps/api": "^2",
"@tauri-apps/plugin-dialog": "^2.7.1",
"@tauri-apps/plugin-opener": "^2",
"bootstrap-icons": "^1.13.1",
"primeng": "^21.1.9",
"rxjs": "~7.8.2",
"tslib": "^2.8.1",
"zone.js": "~0.15.1"
Expand Down
109 changes: 109 additions & 0 deletions phenoxtract-ui/pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions phenoxtract-ui/src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,9 @@ tauri = { version = "2", features = [] }
tauri-plugin-opener = "2"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
tauri-plugin-dialog = "2.7.1"
thiserror = "2.0.18"
directories = "6.0.0"

[dev-dependencies]
tempfile = "3.27.0"
3 changes: 2 additions & 1 deletion phenoxtract-ui/src-tauri/capabilities/default.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"windows": ["main"],
"permissions": [
"core:default",
"opener:default"
"opener:default",
"dialog:default"
]
}
Binary file modified phenoxtract-ui/src-tauri/icons/icon.ico
Binary file not shown.
84 changes: 84 additions & 0 deletions phenoxtract-ui/src-tauri/src/app_dirs.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
use crate::error::PhenoxtractBackendError;
use directories::ProjectDirs;
use std::path::PathBuf;

#[derive(Clone)]
pub struct AppDirs {
config_dir: PathBuf,
_data_dir: PathBuf,
_cache_dir: PathBuf,
}

impl AppDirs {
pub fn new(config_dir: PathBuf, data_dir: PathBuf, cache_dir: PathBuf) -> Self {
Self {
config_dir,
_data_dir: data_dir,
_cache_dir: cache_dir,
}
}
pub fn config_dir(&self) -> &PathBuf {
&self.config_dir
}
pub fn _data_dir(&self) -> &PathBuf {
&self._data_dir
}
pub fn _cache_dir(&self) -> &PathBuf {
&self._cache_dir
}
}
pub fn init_app_dirs() -> Result<AppDirs, PhenoxtractBackendError> {
let proj_dirs = ProjectDirs::from("com", "RobinsonLab", env!("CARGO_PKG_NAME"))
.expect("Could not determine project directories");

std::fs::create_dir_all(proj_dirs.config_dir())
.map_err(|err| PhenoxtractBackendError::UnableToInitStateDirs(err.to_string()))?;
std::fs::create_dir_all(proj_dirs.data_dir())
.map_err(|err| PhenoxtractBackendError::UnableToInitStateDirs(err.to_string()))?;
std::fs::create_dir_all(proj_dirs.cache_dir())
.map_err(|err| PhenoxtractBackendError::UnableToInitStateDirs(err.to_string()))?;

Ok(AppDirs::new(
proj_dirs.config_dir().to_path_buf(),
proj_dirs.data_dir().to_path_buf(),
proj_dirs.cache_dir().to_path_buf(),
))
}

#[cfg(test)]
mod tests {
use super::*;
use std::path::PathBuf;

#[test]
fn test_app_dirs_new_and_getters() {
let mock_config = PathBuf::from("/mock/config/path");
let mock_data = PathBuf::from("/mock/data/path");
let mock_cache = PathBuf::from("/mock/cache/path");

let app_dirs = AppDirs::new(mock_config.clone(), mock_data.clone(), mock_cache.clone());

assert_eq!(app_dirs.config_dir(), &mock_config);
assert_eq!(app_dirs._data_dir(), &mock_data);
assert_eq!(app_dirs._cache_dir(), &mock_cache);
}

#[test]
fn test_init_app_dirs_succeeds() {
let result = init_app_dirs();

assert!(result.is_ok(), "Failed to initialize app directories");

let dirs = result.unwrap();

assert!(
dirs.config_dir().exists(),
"Config directory was not created"
);
assert!(dirs._data_dir().exists(), "Data directory was not created");
assert!(
dirs._cache_dir().exists(),
"Cache directory was not created"
);
}
}
Loading
Loading