use crate::error::Error;
use crate::platform;
use crate::platform::ffi;
use std::fmt;
use std::path::Path;
pub struct ContentWriter {
handle: ffi::CzContentWriter,
}
impl fmt::Debug for ContentWriter {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter
.debug_struct("ContentWriter")
.finish_non_exhaustive()
}
}
unsafe impl Send for ContentWriter {}
impl ContentWriter {
pub fn new(base: &Path) -> Result<Self, Error> {
let outcome = platform::outcome(
ffi::cz_content_writer_new(platform::path(base)?),
format!("write content into {}", base.display()),
)?;
Ok(Self {
handle: outcome.content_writer(),
})
}
pub fn write(&self, data: &[u8]) -> Result<(i64, String), Error> {
platform::outcome(self.handle.write(data.to_vec()), "write data as content").map(|outcome| written(&outcome))
}
pub fn create(&self, from: &Path) -> Result<(i64, String), Error> {
platform::outcome(
self.handle.create(platform::path(from)?),
format!("write {} as content", from.display()),
)
.map(|outcome| written(&outcome))
}
pub fn copy(from: &Path, destination: &Path) -> Result<(i64, String), Error> {
platform::outcome(
ffi::cz_content_writer_copy(platform::path(from)?, platform::path(destination)?),
format!("copy {} to {}", from.display(), destination.display()),
)
.map(|outcome| written(&outcome))
}
}
fn written(outcome: &ffi::CzOutcome) -> (i64, String) {
(outcome.written_size(), outcome.written_digest())
}