use crate::command::{CommandError, NixCmd, NixCmdError};
use super::url::FlakeUrl;
pub async fn nix_eval_attr_json<T>(url: &FlakeUrl) -> Result<T, NixCmdError>
where
T: Default + serde::de::DeserializeOwned,
{
let nix = NixCmd::default();
let result = nix
.run_with_args_expecting_json(&["eval", url.0.as_str(), "--json"])
.await;
match result {
Err(err) if error_is_missing_attribute(&err) => {
Ok(T::default())
}
r => r,
}
}
fn error_is_missing_attribute(err: &NixCmdError) -> bool {
match err {
NixCmdError::CmdError(CommandError::ProcessFailed { stderr, .. }) => {
stderr.contains("does not provide attribute")
}
_ => false,
}
}