Skip to content
Merged
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
8 changes: 6 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -127,10 +127,14 @@ prism-tui stores its settings in a TOML config file:
```toml
default_sort = "Last Played"
sort_ascending = true
data_dir = "~/Games/PrismLauncher" # optional, overrides auto-detection
data_dir = "~/Games/PrismLauncher" # optional, overrides auto-detection
instances_dir = "/mnt/ssd/mc-instances" # optional, overrides instances path
```

Sort and sort-direction preferences are saved automatically. The `data_dir` option supports `~` tilde expansion.
Sort and sort-direction preferences are saved automatically. Both `data_dir` and `instances_dir` support `~` tilde expansion.

- `data_dir` overrides the root PrismLauncher directory (affects accounts, logs, launcher config, and instances).
- `instances_dir` overrides only the instances path, useful when instances live on a separate drive or non-standard location. When unset, defaults to `<data_dir>/instances`.

## Architecture

Expand Down
7 changes: 7 additions & 0 deletions src/data/app_config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ pub struct AppConfig {
pub sort_ascending: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub data_dir: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub instances_dir: Option<String>,
}

fn default_true() -> bool {
Expand All @@ -27,6 +29,7 @@ impl Default for AppConfig {
default_sort: default_sort(),
sort_ascending: true,
data_dir: None,
instances_dir: None,
}
}
}
Expand Down Expand Up @@ -72,6 +75,10 @@ impl AppConfig {
self.data_dir.as_ref().map(|p| expand_tilde(p))
}

pub fn resolved_instances_dir(&self) -> Option<PathBuf> {
self.instances_dir.as_ref().map(|p| expand_tilde(p))
}

pub fn default_sort_mode(&self) -> SortMode {
match self.default_sort.as_str() {
"Name" => SortMode::Name,
Expand Down
19 changes: 17 additions & 2 deletions src/data/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,22 @@ use std::path::{Path, PathBuf};

pub struct PrismConfig {
pub data_dir: PathBuf,
instances_dir_override: Option<PathBuf>,
#[allow(dead_code)]
pub selected_instance: Option<String>,
}

impl PrismConfig {
pub fn load(data_dir: &Path) -> Result<Self> {
pub fn load(data_dir: &Path, instances_dir_override: Option<PathBuf>) -> Result<Self> {
if let Some(ref dir) = instances_dir_override
&& !dir.exists()
Comment on lines +15 to +16
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

validation happens before data_dir is validated in main.rs - if data_dir validation fails first, this error won't be shown

Suggested change
if let Some(ref dir) = instances_dir_override
&& !dir.exists()
if let Some(ref dir) = instances_dir_override {
if !dir.exists() {
Prompt To Fix With AI
This is a comment left during a code review.
Path: src/data/config.rs
Line: 15-16

Comment:
validation happens before `data_dir` is validated in `main.rs` - if `data_dir` validation fails first, this error won't be shown

```suggestion
        if let Some(ref dir) = instances_dir_override {
            if !dir.exists() {
```

How can I resolve this? If you propose a fix, please make it concise.

{
return Err(PrismError::Config(format!(
"Configured instances_dir does not exist: {}",
dir.display()
)));
}

let config_path = data_dir.join("prismlauncher.cfg");
let mut config = Ini::new();

Expand All @@ -25,12 +35,17 @@ impl PrismConfig {

Ok(Self {
data_dir: data_dir.to_path_buf(),
instances_dir_override,
selected_instance,
})
}

pub fn instances_dir(&self) -> PathBuf {
self.data_dir.join("instances")
if let Some(ref dir) = self.instances_dir_override {
dir.clone()
} else {
self.data_dir.join("instances")
}
}

pub fn accounts_path(&self) -> PathBuf {
Expand Down
2 changes: 1 addition & 1 deletion src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ async fn main() -> Result<()> {

let app_config = AppConfig::load();
let data_dir = find_prism_data_dir(app_config.resolved_data_dir())?;
let config = PrismConfig::load(&data_dir)?;
let config = PrismConfig::load(&data_dir, app_config.resolved_instances_dir())?;
let mut app = App::new(config, app_config)?;
let mut terminal = Terminal::new()?;
let mut events = EventStream::new(Duration::from_millis(250));
Expand Down