use std::io::{Write, Error};
use super::utils::NEWLINE;
#[derive(Clone, Debug, PartialEq, Copy)]
pub enum Align {
LEFT,
CENTER,
RIGHT
}
#[derive(Clone, Debug)]
pub struct LineSeparator {
line: [u8; 1],
cross: [u8; 1],
}
impl LineSeparator {
pub fn new(line: char, cross: char) -> LineSeparator {
return LineSeparator{line: [line as u8], cross: [cross as u8]};
}
pub fn print<T: Write+?Sized>(&self, out: &mut T, col_width: &[usize], with_colsep: bool) -> Result<(), Error> {
if with_colsep {
try!(out.write_all(&self.cross));
}
for width in col_width {
try!(out.write_all(&vec![self.line[0]; width+2]));
if with_colsep {
try!(out.write_all(&self.cross));
}
}
return out.write_all(NEWLINE);
}
}
#[derive(Clone, Debug)]
pub struct TableFormat {
col_sep: Option<[u8; 1]>,
line_sep: Option<LineSeparator>,
title_sep: Option<LineSeparator>
}
impl TableFormat {
pub fn new(col_sep: Option<char>, line_sep: Option<LineSeparator>, title_sep: Option<LineSeparator>) -> TableFormat {
let csep = match col_sep {
Some(c) => Some([c as u8]),
None => None
};
return TableFormat{col_sep: csep, line_sep: line_sep, title_sep: title_sep};
}
pub fn print_line_separator<T: Write+?Sized>(&self, out: &mut T, col_width: &[usize]) -> Result<(), Error> {
if let Some(ref l) = self.line_sep {
return l.print(out, col_width, self.col_sep.is_some());
}
return Ok(());
}
pub fn print_title_separator<T: Write+?Sized>(&self, out: &mut T, col_width: &[usize]) -> Result<(), Error> {
if let Some(ref l) = self.title_sep {
return l.print(out, col_width, self.col_sep.is_some());
}
return self.print_line_separator(out, col_width);
}
pub fn print_column_separator<T: Write+?Sized>(&self, out: &mut T) -> Result<(), Error> {
return match self.col_sep {
Some(ref s) => out.write_all(s),
None => Ok(())
};
}
}
pub const MINUS_PLUS_SEP: LineSeparator = LineSeparator{line: ['-' as u8], cross: ['+' as u8]};
pub const EQU_PLUS_SEP: LineSeparator = LineSeparator{line: ['=' as u8], cross: ['+' as u8]};
pub const FORMAT_DEFAULT: TableFormat = TableFormat{col_sep: Some(['|' as u8]), line_sep: Some(MINUS_PLUS_SEP), title_sep: Some(EQU_PLUS_SEP)};
pub const FORMAT_NO_TITLE: TableFormat = TableFormat{col_sep: Some(['|' as u8]), line_sep: Some(MINUS_PLUS_SEP), title_sep: Some(MINUS_PLUS_SEP)};
pub const FORMAT_NO_LINESEP_WITH_TITLE: TableFormat = TableFormat{col_sep: Some(['|' as u8]), line_sep: None, title_sep: Some(MINUS_PLUS_SEP)};
pub const FORMAT_NO_LINESEP: TableFormat = TableFormat{col_sep: Some(['|' as u8]), line_sep: None, title_sep: None};
pub const FORMAT_NO_COLSEP: TableFormat = TableFormat{col_sep: None, line_sep: Some(MINUS_PLUS_SEP), title_sep: Some(EQU_PLUS_SEP)};
pub const FORMAT_NO_BORDER: TableFormat = TableFormat{col_sep: None, line_sep: None, title_sep: None};