use crate::grid_builder::*;
use std::fmt::*;
use std::marker::PhantomData;
pub struct Grid<R: ?Sized, S = DefaultGridSchema<R>> {
b: GridBuilder,
schema: S,
_phantom: PhantomData<fn(&R)>,
}
impl<R: CellsSource + ?Sized> Default for Grid<R, DefaultGridSchema<R>> {
fn default() -> Self {
Self::new()
}
}
impl<R: CellsSource + ?Sized> Grid<R, DefaultGridSchema<R>> {
pub fn new() -> Self {
Self::new_with_schema(DefaultGridSchema::default())
}
}
impl<R: ?Sized, S: GridSchema<Source = R>> Grid<S::Source, S> {
pub fn new_with_schema(schema: S) -> Self {
let b = GridBuilder::new_with_header(&schema);
Grid {
b,
schema,
_phantom: PhantomData::default(),
}
}
}
impl<R: ?Sized, S: GridSchema<Source = R>> Grid<R, S> {
pub fn push(&mut self, source: &R) {
self.b.push(|b| b.extend_with_schema(source, &self.schema));
}
pub fn push_separator(&mut self) {
self.b.push_separator();
}
}
impl<R, S: GridSchema<Source = R>> Extend<R> for Grid<R, S> {
fn extend<T: IntoIterator<Item = R>>(&mut self, iter: T) {
for i in iter {
self.push(&i);
}
}
}
impl<'a, R, S: GridSchema<Source = R>> Extend<&'a R> for Grid<R, S> {
fn extend<T: IntoIterator<Item = &'a R>>(&mut self, iter: T) {
for i in iter {
self.push(i);
}
}
}
impl<R: CellsSource> FromIterator<R> for Grid<R> {
fn from_iter<T: IntoIterator<Item = R>>(iter: T) -> Self {
let mut g = Self::new();
g.extend(iter);
g
}
}
impl<'a, R: CellsSource> FromIterator<&'a R> for Grid<R> {
fn from_iter<T: IntoIterator<Item = &'a R>>(iter: T) -> Self {
let mut g = Self::new();
g.extend(iter);
g
}
}
impl<R: ?Sized, S> Display for Grid<R, S> {
fn fmt(&self, f: &mut Formatter) -> Result {
Display::fmt(&self.b, f)
}
}
impl<R: ?Sized, S> Debug for Grid<R, S> {
fn fmt(&self, f: &mut Formatter) -> Result {
Debug::fmt(&self.b, f)
}
}