use serde::Serialize;
use crate::classify::Category;
use crate::render::{hardlinks_label, is_zero_u64, scan_root_for_wire, RenderConfig, WIRE_VERSION};
#[derive(Debug, Serialize)]
pub(crate) struct WireMeta<'a> {
pub(crate) wire_version: u32,
pub(crate) duvis_version: &'static str,
pub(crate) scan_root: String,
pub(crate) hardlinks: &'a str,
pub(crate) items_scanned: u64,
pub(crate) items_skipped: u64,
}
impl<'a> WireMeta<'a> {
pub(crate) fn from_config(config: &'a RenderConfig<'a>) -> Self {
Self {
wire_version: WIRE_VERSION,
duvis_version: env!("CARGO_PKG_VERSION"),
scan_root: scan_root_for_wire(config.scan_root),
hardlinks: hardlinks_label(config.hardlinks),
items_scanned: config.counts.scanned(),
items_skipped: config.counts.skipped(),
}
}
}
#[derive(Debug, Serialize)]
pub(crate) struct WireTreeRoot<'a> {
pub(crate) meta: WireMeta<'a>,
pub(crate) tree: WireTreeNode,
}
#[derive(Debug, Serialize)]
pub(crate) struct WireTreeNode {
pub(crate) name: String,
pub(crate) relative_path: String,
pub(crate) depth: u32,
pub(crate) size: u64,
pub(crate) size_human: String,
pub(crate) is_dir: bool,
pub(crate) category: Category,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) modified_days_ago: Option<u64>,
pub(crate) file_count: u64,
pub(crate) dir_count: u64,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) children: Option<Vec<WireTreeNode>>,
#[serde(skip_serializing_if = "is_zero_u64")]
pub(crate) truncated_count: u64,
#[serde(skip_serializing_if = "is_zero_u64")]
pub(crate) truncated_size: u64,
}
#[derive(Debug, Serialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub(crate) enum WireStreamRecord<'a> {
Meta(WireMeta<'a>),
Entry(WireStreamEntry<'a>),
}
#[derive(Debug, Serialize)]
pub(crate) struct WireStreamEntry<'a> {
pub(crate) name: &'a str,
pub(crate) relative_path: &'a str,
pub(crate) depth: u32,
pub(crate) size: u64,
pub(crate) size_human: String,
pub(crate) is_dir: bool,
pub(crate) category: Category,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) modified_days_ago: Option<u64>,
pub(crate) file_count: u64,
pub(crate) dir_count: u64,
#[serde(skip_serializing_if = "is_zero_u64")]
pub(crate) truncated_count: u64,
#[serde(skip_serializing_if = "is_zero_u64")]
pub(crate) truncated_size: u64,
}