use anyhow::Context; use jellycommon::AssetLocation; use std::{fs::File, sync::atomic::AtomicUsize}; use crate::AssetLocationExt; static TEMP_COUNTER: AtomicUsize = AtomicUsize::new(0); pub struct TempFile(pub AssetLocation); impl TempFile { pub fn new(generate: impl FnOnce(File) -> anyhow::Result<()>) -> anyhow::Result { let i = TEMP_COUNTER.fetch_add(1, std::sync::atomic::Ordering::Relaxed); let loc = AssetLocation::Temp(format!("jellything-temp-{i}").into()); let file = File::create(loc.path()).context("creating temp file")?; generate(file).context("tempfile generation")?; Ok(Self(loc)) } } impl Drop for TempFile { fn drop(&mut self) { std::fs::remove_file(self.0.path()).expect("cant unlink tempfile") } }