use anyhow::{Context, Result}; use command_run::{Command, LogTo}; use std::fmt::Display; use std::path::PathBuf; use crate::data::Flake; /// Uses `nix` to fetch the provided flake and read general information /// about it using `nix flake info` pub fn get_flake_info + Display>( flake_ref: T, temp_store: bool, extra: &[String], ) -> Result { let args = ["flake", "info", "--json", "--no-write-lock-file"].iter(); let mut command = Command::with_args("nix", args); let command = command.add_arg(flake_ref.as_ref()); if temp_store { let temp_store_path = PathBuf::from("/tmp/flake-info-store"); if !temp_store_path.exists() { std::fs::create_dir_all(&temp_store_path) .with_context(|| "Couldn't create temporary store path")?; } command.add_arg_pair("--store", temp_store_path.canonicalize()?); } command.add_args(extra); let mut command = command.enable_capture(); command.log_to = LogTo::Log; command.log_output_on_error = true; command .run() .with_context(|| format!("Failed to gather information about {}", flake_ref)) .and_then(|o| { let deserialized: Result = serde_json::de::from_str(o.stdout_string_lossy().to_string().as_str()); Ok(deserialized?.resolve_name()) }) }