pgrx_pg_config/
path_methods.rs1use eyre::{eyre, WrapErr};
11use serde_json::value::Value as JsonValue;
12use std::path::PathBuf;
13use std::process::Command;
14
15pub fn prefix_path<P: Into<PathBuf>>(dir: P) -> String {
17 let mut path = std::env::split_paths(&std::env::var_os("PATH").expect("failed to get $PATH"))
18 .collect::<Vec<_>>();
19
20 path.insert(0, dir.into());
21 std::env::join_paths(path)
22 .expect("failed to join paths")
23 .into_string()
24 .expect("failed to construct path")
25}
26
27pub fn get_target_dir() -> eyre::Result<PathBuf> {
29 if let Some(path) = std::env::var_os("CARGO_TARGET_DIR") {
30 return Ok(path.into());
31 }
32 let cargo = std::env::var_os("CARGO").unwrap_or_else(|| "cargo".into());
34 let mut command = Command::new(cargo);
35 command.arg("metadata").arg("--format-version=1").arg("--no-deps");
36 let output =
37 command.output().wrap_err("Unable to get target directory from `cargo metadata`")?;
38 if !output.status.success() {
39 return Err(eyre!("'cargo metadata' failed with exit code: {}", output.status));
40 }
41
42 let json: JsonValue =
43 serde_json::from_slice(&output.stdout).wrap_err("Invalid `cargo metadata` response")?;
44 let target_dir = json.get("target_directory");
45 match target_dir {
46 Some(JsonValue::String(target_dir)) => Ok(target_dir.into()),
47 v => Err(eyre!("could not read target dir from `cargo metadata` got: {v:?}")),
48 }
49}