m10_sdk/types/
pretty_print.rs

1use 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}