use stumpless_sys::*;
use std::error::Error;
use std::ffi::CString;
use crate::error::last_error;
use crate::Target;
pub struct StreamTarget {
target: *mut stumpless_target,
}
impl StreamTarget {
pub fn stderr(filename: &str) -> Result<Self, Box<dyn Error>> {
let c_filename = CString::new(filename)?;
let stream_target = unsafe { stumpless_open_stderr_target(c_filename.as_ptr()) };
if stream_target.is_null() {
match last_error() {
Ok(_success) => panic!("inconsistent stumpless error state"),
Err(err) => Err(Box::new(err)),
}
} else {
Ok(StreamTarget {
target: stream_target,
})
}
}
pub fn stdout(filename: &str) -> Result<Self, Box<dyn Error>> {
let c_filename = CString::new(filename)?;
let stream_target = unsafe { stumpless_open_stdout_target(c_filename.as_ptr()) };
if stream_target.is_null() {
match last_error() {
Ok(_success) => panic!("inconsistent stumpless error state"),
Err(err) => Err(Box::new(err)),
}
} else {
Ok(StreamTarget {
target: stream_target,
})
}
}
}
unsafe impl Sync for StreamTarget {}
impl Target for StreamTarget {
fn get_pointer(&self) -> *mut stumpless_target {
self.target
}
}
impl Drop for StreamTarget {
fn drop(&mut self) {
unsafe {
stumpless_close_stream_target(self.target);
}
}
}