use std::io::prelude::Write;
use std::io::BufWriter;
use std::fs::File;
use std::fs;
use std::path::PathBuf;
pub fn phoenix_create_output_test_dir(output_dir_str: &PathBuf, output_file_str: &PathBuf) -> PathBuf {
let output_dir = PathBuf::from(output_dir_str);
if !output_dir_str.exists() {
fs::create_dir_all(&output_dir).unwrap();
}
let output_file = output_dir.join(&PathBuf::from(output_file_str));
return output_file;
}
pub struct PStrBuffer{
p_absolute_filename: PathBuf,
p_buffer: Option<BufWriter<File>>,
}
impl Drop for PStrBuffer {
fn drop(&mut self) {
self.close();
}
}
impl PStrBuffer {
pub fn new(output_filename: &PathBuf) -> Self {
PStrBuffer{
p_absolute_filename: output_filename.clone(),
p_buffer: Some(BufWriter::new(match File::create(&output_filename) {
Ok(buffer) => buffer,
Err(err) => panic!("PStrBuffer::new : cannot create file {:?}. Error {}", output_filename, err)
}))
}
}
pub fn is_writable(&self) -> bool {
match self.p_buffer {
Some(_) => true,
None => false
}
}
pub fn write(&mut self, text: &String){
match &mut self.p_buffer {
Some(buffer) => {
match buffer.write(&text.as_bytes()) {
Ok(_) => {},
Err(err) => panic!("PStrBuffer::write : Error {}.\n\t- in current file '{:?}'\n\t- cannot write string '{}'", err, self.p_absolute_filename, text)
};
},
None => panic!("PStrBuffer::write : cannot write string '{}' in current file '{:?}'", text, self.p_absolute_filename),
};
}
pub fn close(&mut self){
match &mut self.p_buffer {
Some(buffer) => {
match buffer.flush() {
Ok(_) => {},
Err(err) => panic!("PStrBuffer::close : cannot close current buffer. Error {}", err)
}
},
None => {}
};
self.p_buffer = None;
}
}
#[cfg(test)]
mod tests{
use super::*;
#[test]
fn test_pstrbuffer(){
let output_file = phoenix_create_output_test_dir(&PathBuf::from("target/test_pstrbuffer"), &PathBuf::from("pstrbuffer.txt"));
let mut buffer = PStrBuffer::new(&output_file);
assert!(buffer.is_writable());
buffer.write(&String::from("Just some text in a file\n"));
buffer.close();
assert!(!buffer.is_writable());
}
}