Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-utils/src/file.rs
6939 views
1
use std::fs::File;
2
use std::io::{Read, Seek, Write};
3
4
impl From<File> for ClosableFile {
5
fn from(value: File) -> Self {
6
ClosableFile { inner: value }
7
}
8
}
9
10
impl From<ClosableFile> for File {
11
fn from(value: ClosableFile) -> Self {
12
value.inner
13
}
14
}
15
16
pub struct ClosableFile {
17
inner: File,
18
}
19
20
impl ClosableFile {
21
#[cfg(unix)]
22
pub fn close(self) -> std::io::Result<()> {
23
use std::os::fd::IntoRawFd;
24
let fd = self.inner.into_raw_fd();
25
26
match unsafe { libc::close(fd) } {
27
0 => Ok(()),
28
_ => Err(std::io::Error::last_os_error()),
29
}
30
}
31
32
#[cfg(not(unix))]
33
pub fn close(self) -> std::io::Result<()> {
34
Ok(())
35
}
36
}
37
38
impl AsMut<File> for ClosableFile {
39
fn as_mut(&mut self) -> &mut File {
40
&mut self.inner
41
}
42
}
43
44
impl AsRef<File> for ClosableFile {
45
fn as_ref(&self) -> &File {
46
&self.inner
47
}
48
}
49
50
impl Seek for ClosableFile {
51
fn seek(&mut self, pos: std::io::SeekFrom) -> std::io::Result<u64> {
52
self.inner.seek(pos)
53
}
54
}
55
56
impl Read for ClosableFile {
57
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
58
self.inner.read(buf)
59
}
60
}
61
62
impl Write for ClosableFile {
63
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
64
self.inner.write(buf)
65
}
66
67
fn flush(&mut self) -> std::io::Result<()> {
68
self.inner.flush()
69
}
70
}
71
72
pub trait WriteClose: Write {
73
fn close(self: Box<Self>) -> std::io::Result<()> {
74
Ok(())
75
}
76
}
77
78
impl WriteClose for ClosableFile {
79
fn close(self: Box<Self>) -> std::io::Result<()> {
80
let f = *self;
81
f.close()
82
}
83
}
84
85