m10_sdk/types/
pretty_print.rs1use ron::ser::PrettyConfig;
2use serde::{Deserialize, Serialize};
3use std::fmt;
4use std::io;
5use std::io::LineWriter;
6use std::str::FromStr;
7
8#[derive(Clone, Copy, Debug, Default, PartialEq, Serialize, Deserialize)]
9pub enum Format {
10 Json,
11 Yaml,
12 #[default]
13 Raw,
14 Csv,
15}
16
17impl FromStr for Format {
18 type Err = &'static str;
19
20 fn from_str(s: &str) -> Result<Self, Self::Err> {
21 match s.to_lowercase().as_str() {
22 "json" => Ok(Format::Json),
23 "yaml" => Ok(Format::Yaml),
24 "raw" => Ok(Format::Raw),
25 "csv" => Ok(Format::Csv),
26 _ => Err("no match"),
27 }
28 }
29}
30
31impl fmt::Display for Format {
32 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
33 f.write_str(match self {
34 Format::Json => "json",
35 Format::Yaml => "yaml",
36 Format::Raw => "raw",
37 Format::Csv => "csv",
38 })
39 }
40}
41
42#[derive(Debug, thiserror::Error)]
43pub enum PrintError {
44 #[error(transparent)]
45 Json(#[from] serde_json::Error),
46 #[error(transparent)]
47 Yaml(#[from] serde_yaml::Error),
48 #[error(transparent)]
49 Ron(#[from] ron::Error),
50 #[error(transparent)]
51 Csv(#[from] csv::Error),
52}
53
54pub trait PrettyPrint {
55 fn print(&self, format: Format) -> Result<(), PrintError>;
56}
57
58impl<Item: Serialize> PrettyPrint for Item {
59 fn print(&self, format: Format) -> Result<(), PrintError> {
60 let stdout = io::stdout();
61 let handle = stdout.lock();
62 let writer = LineWriter::new(handle);
63 match format {
64 Format::Json => {
65 serde_json::to_writer_pretty(writer, self)?;
66 }
67 Format::Yaml => {
68 serde_yaml::to_writer(writer, self)?;
69 }
70 Format::Raw => {
71 let pretty = PrettyConfig::new()
72 .depth_limit(4)
73 .separate_tuple_members(true)
74 .compact_arrays(true);
75 ron::ser::to_writer_pretty(writer, self, pretty)?;
76 }
77 Format::Csv => {
78 let mut output = csv::Writer::from_writer(writer);
79 output.serialize(self)?;
80 }
81 }
82 println!();
83 Ok(())
84 }
85}