use serde::Serialize;
use crate::classify::Category;
use crate::render::{is_zero_u64, RenderConfig};
use crate::wire::tree::WireMeta;
#[derive(Debug, Serialize)]
pub(crate) struct WireLargestRoot<'a> {
pub(crate) meta: WireLargestMeta<'a>,
pub(crate) largest: Vec<WireLargestEntry>,
}
#[derive(Debug, Serialize)]
pub(crate) struct WireLargestMeta<'a> {
#[serde(flatten)]
pub(crate) base: WireMeta<'a>,
pub(crate) largest_requested: usize,
pub(crate) total_entries: u64,
}
impl<'a> WireLargestMeta<'a> {
pub(crate) fn from_config(
config: &'a RenderConfig<'a>,
largest_requested: usize,
total_entries: u64,
) -> Self {
Self {
base: WireMeta::from_config(config),
largest_requested,
total_entries,
}
}
}
#[derive(Debug, Serialize)]
pub(crate) struct WireLargestEntry {
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,
}
#[derive(Debug, Serialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub(crate) enum WireLargestNdjsonRecord<'a> {
Meta(WireLargestMeta<'a>),
Entry(WireLargestNdjsonEntry<'a>),
}
#[derive(Debug, Serialize)]
pub(crate) struct WireLargestNdjsonEntry<'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,
}