Skip to content

Commit f3e1818

Browse files
committed
Use level and category enums
1 parent 7e3c1c1 commit f3e1818

File tree

5 files changed

+110
-11
lines changed

5 files changed

+110
-11
lines changed

Cargo.lock

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

qlty-check/src/planner.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ use qlty_config::config::issue_transformer::IssueTransformer;
2121
use qlty_config::config::{DriverType, Match, PluginDef, Set, Triage};
2222
use qlty_config::config::{IssueMode, PluginMode};
2323
use qlty_config::{QltyConfig, Workspace};
24-
use qlty_types::analysis::v1::ExecutionVerb;
24+
use qlty_types::analysis::v1::ExecutionVerb;
25+
use qlty_types::{level_from_str, category_from_str};
2526
use rayon::prelude::*;
2627
use std::collections::HashMap;
2728
use std::time::Instant;
@@ -291,8 +292,8 @@ impl Planner {
291292
for issue_override in &self.config.overrides {
292293
triages.push(Triage {
293294
set: Set {
294-
level: issue_override.level.clone(),
295-
category: issue_override.category.clone(),
295+
level: issue_override.level.as_ref().map(|l| level_from_str(l)),
296+
category: issue_override.category.as_ref().map(|c| category_from_str(c)),
296297
mode: issue_override.mode.map(|m| match m {
297298
IssueMode::Block => PluginMode::Block,
298299
IssueMode::Comment => PluginMode::Comment,

qlty-config/src/config/triage.rs

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ use super::ignore::is_rule_issue_match;
22
use super::plugin::PluginMode;
33
use crate::config::issue_transformer::IssueTransformer;
44
use globset::{Glob, GlobSet, GlobSetBuilder};
5-
use qlty_types::category_from_str;
6-
use qlty_types::{analysis::v1::Issue, level_from_str};
5+
use qlty_types::analysis::v1::{Category, Issue, Level};
6+
use qlty_types::{category_from_str, level_from_str};
77
use schemars::JsonSchema;
8-
use serde::{Deserialize, Serialize};
8+
use serde::{Deserialize, Serialize, Deserializer};
99
use std::sync::RwLock;
1010

1111
#[derive(Debug, Serialize, Deserialize, Default, JsonSchema)]
@@ -34,13 +34,13 @@ impl Clone for Match {
3434
}
3535
}
3636

37-
#[derive(Debug, Serialize, Deserialize, Default, Clone, JsonSchema)]
37+
#[derive(Debug, Serialize, Default, Clone, JsonSchema)]
3838
pub struct Set {
3939
#[serde(default)]
40-
pub level: Option<String>,
40+
pub level: Option<Level>,
4141

4242
#[serde(default)]
43-
pub category: Option<String>,
43+
pub category: Option<Category>,
4444

4545
#[serde(default)]
4646
pub mode: Option<PluginMode>,
@@ -49,6 +49,37 @@ pub struct Set {
4949
pub ignored: bool,
5050
}
5151

52+
impl<'de> Deserialize<'de> for Set {
53+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
54+
where
55+
D: Deserializer<'de>,
56+
{
57+
#[derive(Deserialize)]
58+
struct SetHelper {
59+
#[serde(default)]
60+
level: Option<String>,
61+
62+
#[serde(default)]
63+
category: Option<String>,
64+
65+
#[serde(default)]
66+
mode: Option<PluginMode>,
67+
68+
#[serde(default)]
69+
ignored: bool,
70+
}
71+
72+
let helper = SetHelper::deserialize(deserializer)?;
73+
74+
Ok(Set {
75+
level: helper.level.as_deref().map(level_from_str),
76+
category: helper.category.as_deref().map(category_from_str),
77+
mode: helper.mode,
78+
ignored: helper.ignored,
79+
})
80+
}
81+
}
82+
5283
#[derive(Debug, Serialize, Deserialize, Default, Clone, JsonSchema)]
5384
pub struct Triage {
5485
#[serde(default)]
@@ -111,11 +142,11 @@ impl IssueTransformer for Triage {
111142
let mut new_issue = issue.clone();
112143

113144
if let Some(level) = &self.set.level {
114-
new_issue.level = level_from_str(level).into();
145+
new_issue.level = *level as i32;
115146
}
116147

117148
if let Some(category) = &self.set.category {
118-
new_issue.category = category_from_str(category).into();
149+
new_issue.category = *category as i32;
119150
}
120151

121152
if let Some(mode) = &self.set.mode {

qlty-types/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,7 @@ clap.workspace = true
1919
pbjson-types.workspace = true
2020
pbjson.workspace = true
2121
prost.workspace = true
22+
schemars.workspace = true
2223
serde.workspace = true
24+
serde_json.workspace = true
2325
tree-sitter.workspace = true

qlty-types/src/lib.rs

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
use pbjson_types::{value::Kind, Struct, Value};
2+
use schemars::{
3+
schema::{InstanceType, Schema, SchemaObject, SingleOrVec},
4+
JsonSchema,
5+
};
6+
use serde_json;
27
use std::cmp::Ordering;
38
use std::{
49
collections::HashMap,
@@ -383,3 +388,61 @@ impl AddAssign for tests::v1::CoverageSummary {
383388
*self = *self + other;
384389
}
385390
}
391+
392+
impl JsonSchema for analysis::v1::Level {
393+
fn schema_name() -> String {
394+
"Level".to_owned()
395+
}
396+
397+
fn json_schema(_gen: &mut schemars::gen::SchemaGenerator) -> Schema {
398+
let mut schema = SchemaObject::default();
399+
schema.instance_type = Some(SingleOrVec::Single(Box::new(InstanceType::String)));
400+
401+
let enum_values = vec![
402+
serde_json::Value::String("unspecified".to_owned()),
403+
serde_json::Value::String("note".to_owned()),
404+
serde_json::Value::String("fmt".to_owned()),
405+
serde_json::Value::String("low".to_owned()),
406+
serde_json::Value::String("medium".to_owned()),
407+
serde_json::Value::String("high".to_owned()),
408+
];
409+
410+
schema.enum_values = Some(enum_values);
411+
412+
Schema::Object(schema)
413+
}
414+
}
415+
416+
impl JsonSchema for analysis::v1::Category {
417+
fn schema_name() -> String {
418+
"Category".to_owned()
419+
}
420+
421+
fn json_schema(_gen: &mut schemars::gen::SchemaGenerator) -> Schema {
422+
let mut schema = SchemaObject::default();
423+
schema.instance_type = Some(SingleOrVec::Single(Box::new(InstanceType::String)));
424+
425+
let enum_values = vec![
426+
serde_json::Value::String("unspecified".to_owned()),
427+
serde_json::Value::String("bug".to_owned()),
428+
serde_json::Value::String("vulnerability".to_owned()),
429+
serde_json::Value::String("structure".to_owned()),
430+
serde_json::Value::String("duplication".to_owned()),
431+
serde_json::Value::String("security_hotspot".to_owned()),
432+
serde_json::Value::String("performance".to_owned()),
433+
serde_json::Value::String("documentation".to_owned()),
434+
serde_json::Value::String("type_check".to_owned()),
435+
serde_json::Value::String("style".to_owned()),
436+
serde_json::Value::String("anti_pattern".to_owned()),
437+
serde_json::Value::String("accessibility".to_owned()),
438+
serde_json::Value::String("dead_code".to_owned()),
439+
serde_json::Value::String("lint".to_owned()),
440+
serde_json::Value::String("secret".to_owned()),
441+
serde_json::Value::String("dependency_alert".to_owned()),
442+
];
443+
444+
schema.enum_values = Some(enum_values);
445+
446+
Schema::Object(schema)
447+
}
448+
}

0 commit comments

Comments
 (0)