code_passenger 0.4.0

Scans a Rust workspace with klepto and does the writing: feature gates across every crate from one features document, proven by cargo check, Cargo.toml edits, file headers from the plan, and the history of it.
Documentation
use crate::model::{FileReport, PlanSection};
use super::{HeaderPlan, HeaderPlanV2};

pub struct VerbosePlan;

impl HeaderPlan for VerbosePlan {
    fn id(&self) -> &'static str { "verbose" }

    fn render_for_rust(&self, report: &FileReport, begin: &str, end: &str) -> String {
        let mut out = String::new();
        out.push_str(begin);
        out.push('\n');

        out.push_str("//! ----------------------------------------------\n");
        out.push_str("//! DOCUMENT DETAILS -----------------------------\n");
        out.push_str("//!\n");
        out.push_str(&format!("//! filename:{}\n", report.document.filename));
        out.push_str("//! description:\n");
        if report.used.packages.is_empty() {
            out.push_str("//! usages:none\n");
        } else {
            out.push_str(&format!("//! usages:{:?}\n", report.used.packages.iter().collect::<Vec<_>>()));
        }
        out.push_str("//!\n");

        out.push_str("//! ----------------------------------------------\n");
        out.push_str("//! FEATURE NOTES --------------------------------\n");

        for n in &report.notes {
            out.push_str("//!\n");
            out.push_str(&format!("//! feature_name:{}\n", n.feature_name));
            out.push_str(&format!("//! deps:{:?}\n", n.deps));
            out.push_str(&format!("//! scope:{:?}\n", n.scope));
            out.push_str(&format!("//! corpus:{}\n", n.corpus));
            out.push_str(&format!("//! unavailable:{:?}\n", n.unavailable));
            if !n.lost_by.is_empty() {
                out.push_str(&format!("//! lost_by:{:?}\n", n.lost_by));
            }
        }

        out.push_str("//!\n");
        out.push_str("//! ----------------------------------------------\n");
        out.push_str("//! CORPUS FEATURES ------------------------------\n");
        out.push_str("//!\n");

        for f in &report.corpus_features {
            out.push_str(&format!("#![cfg(feature = \"{}\")]\n", f));
        }

        out.push_str(end);
        out.push('\n');
        out
    }
}

impl HeaderPlanV2 for VerbosePlan {
    fn id(&self) -> &'static str { "verbose" }

    fn sections(&self) -> &[PlanSection] {
        const SECTIONS: &[PlanSection] = &[
            PlanSection::DocumentDetails,
            PlanSection::FeatureNotes,
            PlanSection::CorpusGates,
        ];
        SECTIONS
    }
}