1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//! # Sponge
//!
//! A [`Sponge`] is a safe and efficient way to update a file in place.
//!
//! ### Example
//!
//! ```rust
//! # use std::io::Write;
//! let mut temp = tempfile_fast::Sponge::new_for("example.txt").unwrap();
//! temp.write_all(b"hello").unwrap();
//! temp.commit().unwrap();
//! ```
//!
//! ## PersistableTempFile
//!
//! The raw [`PersistableTempFile`] is also available. However,
//! You probably want to use the `tempfile` crate unless you have
//! hit a known performance problem, or you only care about modern
//! Linux. See `README.md` for more details.
//!
//! ### Example (raw)
//!
//! ```rust,no_run
//! # use std::io::Write;
//! let mut temp = tempfile_fast::PersistableTempFile::new_in("/var/lib/foo").unwrap();
//! temp.write_all(b"hello").unwrap();
//! temp.persist_noclobber("/var/lib/foo/bar").unwrap();
//! ```

#[cfg(target_os = "linux")]
mod linux;

#[cfg(not(target_os = "linux"))]
mod linux {
    use std::fs;
    use std::io;
    use std::path::Path;

    #[inline]
    pub fn create_nonexclusive_tempfile_in<P>(_dir: P) -> io::Result<fs::File> {
        Err(io::ErrorKind::InvalidInput.into())
    }

    #[inline]
    pub fn link_at<P: AsRef<Path>>(_what: &fs::File, _dest: P) -> io::Result<()> {
        Err(io::ErrorKind::InvalidData.into())
    }
}

mod persistable;
mod sponge;

pub use crate::persistable::PersistError;
pub use crate::persistable::PersistableTempFile;
pub use sponge::Sponge;