use rich::{Console, Json};
use serde::Serialize;
use super::{from_serialize, DataError, Explorer, Format, TableView};
pub fn json<T: Serialize + ?Sized>(value: &T) -> Result<Json, DataError> {
let text = serde_json::to_string(value)
.map_err(|e| DataError::new(Format::Json, e.to_string(), None))?;
Json::new(&text).map_err(|e| DataError::new(Format::Json, e.to_string(), None))
}
pub fn table<T: Serialize>(records: &[T]) -> Result<TableView<'static>, DataError> {
Ok(TableView::new(from_serialize(records)?))
}
pub fn tree<T: Serialize + ?Sized>(value: &T) -> Result<Explorer<'static>, DataError> {
Ok(Explorer::new(from_serialize(value)?))
}
pub fn print_json<T: Serialize + ?Sized>(value: &T) -> Result<(), DataError> {
print_json_to(&Console::new(), value)
}
pub fn print_json_to<T: Serialize + ?Sized>(console: &Console, value: &T) -> Result<(), DataError> {
console.print(&json(value)?);
Ok(())
}
pub fn print_table<T: Serialize>(records: &[T]) -> Result<(), DataError> {
print_table_to(&Console::new(), records)
}
pub fn print_table_to<T: Serialize>(console: &Console, records: &[T]) -> Result<(), DataError> {
console.print(&table(records)?);
Ok(())
}
pub fn print_tree<T: Serialize + ?Sized>(value: &T) -> Result<(), DataError> {
print_tree_to(&Console::new(), value)
}
pub fn print_tree_to<T: Serialize + ?Sized>(console: &Console, value: &T) -> Result<(), DataError> {
console.print(&tree(value)?);
Ok(())
}