onpath 0.2.0

Get your tools on the PATH — cross-shell, cross-platform, zero fuss
Documentation
use std::path::{Path, PathBuf};

use crate::config::Position;
use crate::context::SystemContext;
use crate::shell::{Shell, ShellKind};

pub struct Posix;

impl Shell for Posix {
    fn kind(&self) -> ShellKind {
        ShellKind::Posix
    }

    fn env_extension(&self) -> &'static str {
        ""
    }

    fn env_script(&self, dir: &Path, position: Position) -> String {
        super::posix_env_script(dir, position)
    }

    fn source_line(&self, env_script_path: &Path) -> String {
        super::posix_source_line(env_script_path)
    }

    fn rc_candidates(&self, ctx: &SystemContext) -> Vec<PathBuf> {
        vec![ctx.home_dir().join(".profile")]
    }

    fn primary_rc(&self, ctx: &SystemContext) -> PathBuf {
        ctx.home_dir().join(".profile")
    }
}

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

    #[test]
    fn env_script_contains_guard() {
        let script = Posix.env_script(Path::new("/usr/local/bin"), Position::Prepend);
        assert!(script.contains(r#"case ":${PATH}:""#));
        assert!(script.contains("/usr/local/bin"));
        assert!(script.contains("export PATH="));
    }

    #[test]
    fn env_script_prepend_puts_dir_first() {
        let script = Posix.env_script(Path::new("/app/bin"), Position::Prepend);
        assert!(script.contains(r#"export PATH="/app/bin:$PATH""#));
    }

    #[test]
    fn env_script_append_puts_dir_last() {
        let script = Posix.env_script(Path::new("/app/bin"), Position::Append);
        assert!(script.contains(r#"export PATH="$PATH:/app/bin""#));
    }

    #[test]
    fn source_line_uses_dot_command() {
        let line = Posix.source_line(Path::new("/home/user/.myapp/env"));
        assert_eq!(line, ". \"/home/user/.myapp/env\"");
    }

    #[test]
    fn rc_candidates_returns_profile() {
        let ctx = SystemContext::with_home(PathBuf::from("/home/user"));
        let candidates = Posix.rc_candidates(&ctx);
        assert_eq!(candidates, vec![PathBuf::from("/home/user/.profile")]);
    }
}