diff --git a/src/helpers.rs b/src/helpers.rs index 3dc2de96..3381c839 100644 --- a/src/helpers.rs +++ b/src/helpers.rs @@ -1,12 +1,14 @@ use std::fmt::Debug; use std::fs; use std::io; +use std::ops; use std::path::{Path, PathBuf}; use bytes::Bytes; use cargo_toml::Manifest; use futures_util::stream::Stream; use log::debug; +use once_cell::sync::OnceCell; use reqwest::{tls, Client, ClientBuilder, Method, Response}; use serde::Serialize; use tempfile::NamedTempFile; @@ -40,6 +42,14 @@ pub use tls_version::TLSVersion; mod crate_name; pub use crate_name::CrateName; +pub fn cargo_home() -> Result<&'static Path, io::Error> { + static CARGO_HOME: OnceCell = OnceCell::new(); + + CARGO_HOME + .get_or_try_init(home::cargo_home) + .map(ops::Deref::deref) +} + pub async fn await_task(task: tokio::task::JoinHandle>) -> miette::Result { match task.await { Ok(res) => res, diff --git a/src/metafiles/v1.rs b/src/metafiles/v1.rs index 1180814a..19f0ab8f 100644 --- a/src/metafiles/v1.rs +++ b/src/metafiles/v1.rs @@ -10,6 +10,7 @@ use serde::{Deserialize, Serialize}; use thiserror::Error; use super::CrateVersionSource; +use crate::cargo_home; #[derive(Clone, Debug, Default, Deserialize, Serialize)] pub struct CratesToml { @@ -18,7 +19,7 @@ pub struct CratesToml { impl CratesToml { pub fn default_path() -> Result { - Ok(home::cargo_home()?.join(".crates.toml")) + Ok(cargo_home()?.join(".crates.toml")) } pub fn load() -> Result { diff --git a/src/metafiles/v2.rs b/src/metafiles/v2.rs index 70c4e46e..4724b1e8 100644 --- a/src/metafiles/v2.rs +++ b/src/metafiles/v2.rs @@ -9,6 +9,7 @@ use serde::{Deserialize, Serialize}; use thiserror::Error; use super::CrateVersionSource; +use crate::cargo_home; #[derive(Clone, Debug, Default, Deserialize, Serialize)] pub struct Crates2Json { @@ -39,7 +40,7 @@ pub struct CrateInfo { impl Crates2Json { pub fn default_path() -> Result { - Ok(home::cargo_home()?.join(".crates2.json")) + Ok(cargo_home()?.join(".crates2.json")) } pub fn load() -> Result {