use serde::Serialize;
use crate::classify::{Category, Classification, ClassificationReason};
#[derive(Debug, Serialize)]
pub(crate) struct WireExplain<'a> {
pub(crate) name: &'a str,
pub(crate) as_directory: WireClassification,
pub(crate) as_file: WireClassification,
}
#[derive(Debug, Serialize)]
pub(crate) struct WireClassification {
pub(crate) category: Category,
pub(crate) reason: WireClassificationReason,
}
#[derive(Debug, Serialize)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub(crate) enum WireClassificationReason {
DirNameExact { needle: &'static str },
DirNameContainsCache,
FileNameSuffix { needle: &'static str },
FileExtension { needle: &'static str },
Default,
}
impl<'a> WireExplain<'a> {
pub(crate) fn new(name: &'a str, as_dir: &Classification, as_file: &Classification) -> Self {
Self {
name,
as_directory: WireClassification::from(as_dir),
as_file: WireClassification::from(as_file),
}
}
}
impl From<&Classification> for WireClassification {
fn from(c: &Classification) -> Self {
Self {
category: c.category,
reason: WireClassificationReason::from(&c.reason),
}
}
}
impl From<&ClassificationReason> for WireClassificationReason {
fn from(r: &ClassificationReason) -> Self {
match *r {
ClassificationReason::DirNameExact { needle } => Self::DirNameExact { needle },
ClassificationReason::DirNameContainsCache => Self::DirNameContainsCache,
ClassificationReason::FileNameSuffix { needle } => Self::FileNameSuffix { needle },
ClassificationReason::FileExtension { needle } => Self::FileExtension { needle },
ClassificationReason::Default => Self::Default,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::classify::{explain_dir, explain_file};
#[test]
fn wire_shape_matches_v0_1_x_explain_format() {
let as_dir = explain_dir("node_modules");
let as_file = explain_file("node_modules");
let payload = WireExplain::new("node_modules", &as_dir, &as_file);
let v: serde_json::Value = serde_json::to_value(&payload).unwrap();
assert_eq!(v["name"], "node_modules");
assert_eq!(v["as_directory"]["category"], "cache");
assert_eq!(v["as_directory"]["reason"]["kind"], "dir_name_exact");
assert_eq!(v["as_directory"]["reason"]["needle"], "node_modules");
assert_eq!(v["as_file"]["category"], "other");
assert_eq!(v["as_file"]["reason"]["kind"], "default");
}
}