Mountain/ProcessManagement/NodeResolver/TryFnm.rs
1#![allow(non_snake_case)]
2
3//! fnm shim lookup. `FNM_MULTISHELL_PATH` (active shell) wins; otherwise
4//! probe the per-OS multishell cache directories.
5
6use std::path::PathBuf;
7
8use crate::ProcessManagement::NodeResolver::{NodeExecutableName, NodeSource, ResolvedNode};
9
10pub fn Fn() -> Option<ResolvedNode::Struct> {
11 if let Ok(Multishell) = std::env::var("FNM_MULTISHELL_PATH") {
12 let Candidate = PathBuf::from(Multishell).join("bin").join(NodeExecutableName::Fn());
13
14 if Candidate.exists() {
15 return Some(ResolvedNode::Struct { Path:Candidate, Source:NodeSource::Enum::Fnm });
16 }
17 }
18
19 let Home = std::env::var("HOME").ok()?;
20
21 for Relative in ["/.local/share/fnm/current/bin", "/Library/Caches/fnm_multishells/current/bin"] {
22 let Candidate = PathBuf::from(&Home)
23 .join(Relative.trim_start_matches('/'))
24 .join(NodeExecutableName::Fn());
25
26 if Candidate.exists() {
27 return Some(ResolvedNode::Struct { Path:Candidate, Source:NodeSource::Enum::Fnm });
28 }
29 }
30
31 None
32}