seer_core/output/
mod.rs

1mod human;
2mod json;
3
4pub use human::HumanFormatter;
5pub use json::JsonFormatter;
6
7use serde::{Deserialize, Serialize};
8
9#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
10#[serde(rename_all = "lowercase")]
11pub enum OutputFormat {
12    #[default]
13    Human,
14    Json,
15}
16
17impl std::str::FromStr for OutputFormat {
18    type Err = String;
19
20    fn from_str(s: &str) -> Result<Self, Self::Err> {
21        match s.to_lowercase().as_str() {
22            "human" | "text" | "pretty" => Ok(OutputFormat::Human),
23            "json" => Ok(OutputFormat::Json),
24            _ => Err(format!("Unknown output format: {}", s)),
25        }
26    }
27}
28
29pub trait OutputFormatter {
30    fn format_whois(&self, response: &crate::whois::WhoisResponse) -> String;
31    fn format_rdap(&self, response: &crate::rdap::RdapResponse) -> String;
32    fn format_dns(&self, records: &[crate::dns::DnsRecord]) -> String;
33    fn format_propagation(&self, result: &crate::dns::PropagationResult) -> String;
34    fn format_lookup(&self, result: &crate::lookup::LookupResult) -> String;
35    fn format_status(&self, response: &crate::status::StatusResponse) -> String;
36}
37
38pub fn get_formatter(format: OutputFormat) -> Box<dyn OutputFormatter> {
39    match format {
40        OutputFormat::Human => Box::new(HumanFormatter::new()),
41        OutputFormat::Json => Box::new(JsonFormatter::new()),
42    }
43}