fn validate_with_context()

in crates/figterm/src/inline/validate.rs [16:59]


fn validate_with_context<CwdStr, Cwd, HdStr, Hd, CtxStr, Ctx, E>(
    command: &str,
    cwd: Cwd,
    home_dir: Hd,
    ctx: Ctx,
) -> bool
where
    CwdStr: AsRef<str>,
    Cwd: FnOnce() -> Option<CwdStr>,
    HdStr: AsRef<str>,
    Hd: FnOnce() -> Option<HdStr>,
    CtxStr: AsRef<str>,
    Ctx: FnMut(&str) -> Result<Option<CtxStr>, E>,
{
    let command = command.trim();

    // Currently the api responds with redactions of `XXX` if there is PII identified, just filter
    // these to improve quality
    if command.contains("XXX") {
        return false;
    }

    // Try to validate the args to "cd",
    if let Some(args) = shlex::split(command) {
        if args.first().map(|s| s.as_str()) == Some("cd") && args.len() == 2 {
            if let Some(arg) = args.get(1) {
                if let Ok(arg) = shellexpand::full_with_context(arg, home_dir, ctx) {
                    let path = Path::new(arg.as_ref());
                    if path.is_absolute() && !path.is_dir() {
                        return false;
                    }
                    let canonicalized = cwd().and_then(|cwd| Path::new(cwd.as_ref()).join(path).canonicalize().ok());
                    match canonicalized {
                        Some(p) if !p.is_dir() => return false,
                        Some(_) => {},
                        None => return false,
                    }
                }
            }
        }
    }

    true
}