io_arrays/
files.rs

1//! Common code for Posix-ish and Windows platforms for implementing
2//! [`ReadAt`] and [`WriteAt`] for file-like types which implement
3//! [`AsFilelike`].
4//!
5//! [`WriteAt`]: crate::WriteAt
6
7use crate::borrow_streamer::{BorrowStreamer, BorrowStreamerMut};
8use crate::{Advice, ReadAt};
9use io_lifetimes::AsFilelike;
10use std::fs::File;
11use std::io::{self, copy, Read};
12use system_interface::fs::FileIoExt;
13
14/// Implement [`crate::Array::advise`].
15#[inline]
16pub fn advise<'f, Filelike: AsFilelike>(
17    filelike: &Filelike,
18    offset: u64,
19    len: u64,
20    advice: Advice,
21) -> io::Result<()> {
22    <File as FileIoExt>::advise(&filelike.as_filelike_view::<File>(), offset, len, advice)
23}
24
25/// Implement [`crate::WriteAt::copy_from`].
26#[inline]
27pub fn copy_from<'f, Filelike: AsFilelike, R: ReadAt>(
28    filelike: &Filelike,
29    offset: u64,
30    input: &R,
31    input_offset: u64,
32    len: u64,
33) -> io::Result<u64> {
34    let input_view = filelike.as_filelike_view::<File>();
35    let mut input_tmp = &*input_view;
36    let mut output_streamer = BorrowStreamerMut::new(&mut input_tmp, offset);
37    let input_streamer = BorrowStreamer::new(input, input_offset);
38    copy(&mut input_streamer.take(len), &mut output_streamer)
39}
40
41/// Implement [`crate::WriteAt::set_len`].
42#[inline]
43pub fn set_len<'f, Filelike: AsFilelike>(filelike: &Filelike, size: u64) -> io::Result<()> {
44    filelike.as_filelike_view::<File>().set_len(size)
45}