aboutsummaryrefslogtreecommitdiff
path: root/mingling_cli/src/linter/cmd_explain.rs
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-08-06 17:23:34 +0800
committer魏曹先生 <1992414357@qq.com>2026-08-06 17:23:34 +0800
commitc3cd11149d39802c431381d8f4d685581ab8c0f5 (patch)
tree197ff9b75232656d85ad23915565f3d09c29b096 /mingling_cli/src/linter/cmd_explain.rs
parent97472218d3b5b2a4377d62442515c0bb43b853db (diff)
feat(linter): refactor lint registry into program resource
Extract lint registry loading from cmd_explain into a shared program-level resource initialized via setup.
Diffstat (limited to 'mingling_cli/src/linter/cmd_explain.rs')
-rw-r--r--mingling_cli/src/linter/cmd_explain.rs63
1 files changed, 15 insertions, 48 deletions
diff --git a/mingling_cli/src/linter/cmd_explain.rs b/mingling_cli/src/linter/cmd_explain.rs
index d1dffc5..f0a7571 100644
--- a/mingling_cli/src/linter/cmd_explain.rs
+++ b/mingling_cli/src/linter/cmd_explain.rs
@@ -1,5 +1,6 @@
+use crate::{Next, linter::registry::LintRegistry};
use mingling::{
- Grouped, Routable, ShellContext, StructuralData, Suggest, SuggestItem,
+ Grouped, LazyRes, Routable, ShellContext, StructuralData, Suggest, SuggestItem,
macros::{
arg, buffer, chain, completion, dispatcher, metadata, pack, pack_err_structural, r_println,
renderer, routeify,
@@ -7,10 +8,7 @@ use mingling::{
metadata::Description,
picker::EntryPicker,
};
-use serde::{Deserialize, Serialize};
-use std::sync::OnceLock;
-
-use crate::Next;
+use serde::Serialize;
dispatcher!("explain");
@@ -43,43 +41,14 @@ pub fn handle_explain(args: EntryExplain) -> Next {
StateExplainLint::new(lint_name).into()
}
-/// Mirror of the lint registry JSON generated by `build.rs` (`registry.json`).
-#[derive(Debug, Deserialize)]
-struct LintRegistry {
- lints: Vec<LintEntry>,
-}
-
-#[derive(Debug, Deserialize)]
-struct LintEntry {
- name: String,
- title: String,
- summary: String,
- metadata: LintMetadata,
-}
-
-#[derive(Debug, Deserialize)]
-struct LintMetadata {
- active_on: String,
- author: String,
- default: String,
-}
-
-/// The lint registry, embedded at compile time via `include_str!`.
-///
-/// `registry.json` is regenerated by `build.rs` on every build, so the
-/// embedded copy always reflects the lints in `src/lints/`.
-fn lint_registry() -> &'static LintRegistry {
- static REGISTRY: OnceLock<LintRegistry> = OnceLock::new();
- REGISTRY.get_or_init(|| {
- serde_json::from_str(include_str!("../../registry.json"))
- .expect("failed to parse embedded registry.json")
- })
-}
-
#[chain]
-pub fn handle_state_explain_lint(p: StateExplainLint) -> Next {
+pub fn handle_state_explain_lint(
+ p: StateExplainLint,
+ registry: &mut LazyRes<LintRegistry>,
+) -> Next {
+ let registry = registry.get_ref();
let lint_name = p.inner;
- let Some(entry) = lint_registry().lints.iter().find(|l| l.name == lint_name) else {
+ let Some(entry) = registry.lints.iter().find(|l| l.name == lint_name) else {
return ErrorNoSuchLint::new(lint_name).to_chain();
};
ResultExplainLint {
@@ -111,25 +80,23 @@ pub fn render_error_no_explain_lint_provided(_: ErrorNoExplainLintProvided) {
}
#[renderer(buffer)]
-pub fn render_error_no_such_lint(err: ErrorNoSuchLint) {
+pub fn render_error_no_such_lint(err: ErrorNoSuchLint, registry: &mut LazyRes<LintRegistry>) {
+ let registry = registry.get_ref();
r_println!("No such lint: \"{}\"", err.info);
r_println!("");
r_println!("Available lints:");
- for entry in &lint_registry().lints {
+ for entry in registry.lints.iter() {
r_println!(" {}", entry.name);
}
}
#[completion(EntryExplain)]
-pub fn complete_explain(ctx: &ShellContext) -> Suggest {
+pub fn complete_explain(ctx: &ShellContext, registry: &mut LazyRes<LintRegistry>) -> Suggest {
+ let registry = registry.get_ref();
if ctx.previous_word != "explain" {
return Suggest::FileCompletion;
}
- let lints: Vec<String> = lint_registry()
- .lints
- .iter()
- .map(|l| l.name.clone())
- .collect();
+ let lints: Vec<String> = registry.lints.iter().map(|l| l.name.clone()).collect();
let mut suggest = Suggest::new();
for lint in lints {
suggest.insert(SuggestItem::Simple(lint));