|
| 1 | +//! 剩余语言六类别适用性(ObjC/Nix/CUDA/Liquid 等) |
| 2 | +//! |
| 3 | +//! 验收标准:每个槽位有实际依据,not_applicable 不得用缺工具解释 |
| 4 | +
|
| 5 | +use serde::{Deserialize, Serialize}; |
| 6 | + |
| 7 | +/// 适用性槽位 |
| 8 | +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] |
| 9 | +pub enum SlotStatus { |
| 10 | + /// 适用 |
| 11 | + Applicable, |
| 12 | + /// 不适用 |
| 13 | + NotApplicable, |
| 14 | + /// 缺口 |
| 15 | + Gap, |
| 16 | +} |
| 17 | + |
| 18 | +/// 槽位 |
| 19 | +#[derive(Debug, Clone, Serialize, Deserialize)] |
| 20 | +pub struct ApplicabilitySlot { |
| 21 | + /// 类别 |
| 22 | + pub category: String, |
| 23 | + /// 状态 |
| 24 | + pub status: SlotStatus, |
| 25 | + /// 依据 |
| 26 | + pub rationale: String, |
| 27 | +} |
| 28 | + |
| 29 | +/// 剩余语言适用性检查器 |
| 30 | +pub struct RemainingLanguageApplicability; |
| 31 | + |
| 32 | +impl RemainingLanguageApplicability { |
| 33 | + /// 检查 Nix 适用性 |
| 34 | + pub fn check_nix() -> Vec<ApplicabilitySlot> { |
| 35 | + vec![ |
| 36 | + ApplicabilitySlot { category: "lint".into(), status: SlotStatus::Applicable, rationale: "nix-instantiate --parse 可用".into() }, |
| 37 | + ApplicabilitySlot { category: "comments".into(), status: SlotStatus::Applicable, rationale: "Nix Doc 可用".into() }, |
| 38 | + ApplicabilitySlot { category: "dependencies".into(), status: SlotStatus::Applicable, rationale: "flake.nix 可用".into() }, |
| 39 | + ApplicabilitySlot { category: "cve".into(), status: SlotStatus::Gap, rationale: "无专用 CVE 工具".into() }, |
| 40 | + ApplicabilitySlot { category: "security".into(), status: SlotStatus::Gap, rationale: "无专用安全工具".into() }, |
| 41 | + ApplicabilitySlot { category: "build".into(), status: SlotStatus::Applicable, rationale: "nix-build 可用".into() }, |
| 42 | + ] |
| 43 | + } |
| 44 | + |
| 45 | + /// 检查 CUDA 适用性 |
| 46 | + pub fn check_cuda() -> Vec<ApplicabilitySlot> { |
| 47 | + vec![ |
| 48 | + ApplicabilitySlot { category: "lint".into(), status: SlotStatus::Applicable, rationale: "nvcc --Werror 可用".into() }, |
| 49 | + ApplicabilitySlot { category: "comments".into(), status: SlotStatus::Applicable, rationale: "Doxygen 可用".into() }, |
| 50 | + ApplicabilitySlot { category: "dependencies".into(), status: SlotStatus::Applicable, rationale: "CMake 可用".into() }, |
| 51 | + ApplicabilitySlot { category: "cve".into(), status: SlotStatus::Gap, rationale: "无专用 CVE 工具".into() }, |
| 52 | + ApplicabilitySlot { category: "security".into(), status: SlotStatus::Gap, rationale: "无专用安全工具".into() }, |
| 53 | + ApplicabilitySlot { category: "build".into(), status: SlotStatus::Applicable, rationale: "nvcc 可用".into() }, |
| 54 | + ] |
| 55 | + } |
| 56 | + |
| 57 | + /// 检查 Liquid 适用性 |
| 58 | + pub fn check_liquid() -> Vec<ApplicabilitySlot> { |
| 59 | + vec![ |
| 60 | + ApplicabilitySlot { category: "lint".into(), status: SlotStatus::Applicable, rationale: "liquidjs 可用".into() }, |
| 61 | + ApplicabilitySlot { category: "comments".into(), status: SlotStatus::Applicable, rationale: "Liquid 注释可用".into() }, |
| 62 | + ApplicabilitySlot { category: "dependencies".into(), status: SlotStatus::Gap, rationale: "无专用依赖工具".into() }, |
| 63 | + ApplicabilitySlot { category: "cve".into(), status: SlotStatus::Gap, rationale: "无专用 CVE 工具".into() }, |
| 64 | + ApplicabilitySlot { category: "security".into(), status: SlotStatus::Gap, rationale: "无专用安全工具".into() }, |
| 65 | + ApplicabilitySlot { category: "build".into(), status: SlotStatus::Applicable, rationale: "Jekyll/Hugo 可用".into() }, |
| 66 | + ] |
| 67 | + } |
| 68 | + |
| 69 | + /// 验证 not_applicable 不用缺工具解释 |
| 70 | + pub fn validate_no_missing_tool_excuse(slots: &[ApplicabilitySlot]) -> bool { |
| 71 | + slots.iter().all(|s| s.status != SlotStatus::NotApplicable || !s.rationale.contains("缺工具")) |
| 72 | + } |
| 73 | +} |
0 commit comments