Skip to main content

wowlab_docgen_cli/context/
features.rs

1use serde::Serialize;
2use wowlab_common::markdown;
3
4use crate::RenderCtx;
5
6/// A Cargo feature entry for the features table.
7#[derive(Debug, Serialize)]
8pub(super) struct Feature {
9    pub name: String,
10    pub deps: String,
11}
12
13/// Gather Cargo features from metadata.
14pub(super) fn gather(ctx: &RenderCtx<'_>) -> Vec<Feature> {
15    ctx.metadata
16        .features
17        .iter()
18        .map(|(name, deps)| Feature {
19            name: name.clone(),
20            deps: format_deps(deps),
21        })
22        .collect()
23}
24
25fn format_deps(deps: &[String]) -> String {
26    if deps.is_empty() {
27        return "\u{2014}".to_string();
28    }
29
30    deps.iter()
31        .map(markdown::code)
32        .collect::<Vec<_>>()
33        .join(", ")
34}
35
36#[cfg(test)]
37mod tests {
38    use googletest::prelude::*;
39
40    use super::*;
41
42    #[gtest]
43    fn format_deps_empty() -> Result<()> {
44        verify_eq!(format_deps(&[]), "\u{2014}")
45    }
46
47    #[gtest]
48    fn format_deps_single() -> Result<()> {
49        let deps = vec!["serde".to_string()];
50
51        verify_eq!(format_deps(&deps), "`serde`")
52    }
53
54    #[gtest]
55    fn format_deps_multiple() -> Result<()> {
56        let deps = vec!["serde".to_string(), "tokio".to_string()];
57
58        verify_eq!(format_deps(&deps), "`serde`, `tokio`")
59    }
60}