backhopper_core/model/
resolver_coverage.rs1use std::collections::BTreeSet;
15
16use serde::{Deserialize, Serialize};
17
18use crate::model::symbol::SymbolKind;
19
20#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
22#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
23#[serde(rename_all = "snake_case")]
24pub enum ResolverClass {
25 Macro,
26 Include,
27 Behaviour,
28 QualifiedCall,
29 Record,
30 LocalCall,
31 Type,
32 IndirectCall,
33}
34
35impl ResolverClass {
36 #[must_use]
38 pub fn as_str(self) -> &'static str {
39 match self {
40 ResolverClass::Macro => "macro",
41 ResolverClass::Include => "include",
42 ResolverClass::Behaviour => "behaviour",
43 ResolverClass::QualifiedCall => "qualified_call",
44 ResolverClass::Record => "record",
45 ResolverClass::LocalCall => "local_call",
46 ResolverClass::Type => "type",
47 ResolverClass::IndirectCall => "indirect_call",
48 }
49 }
50
51 pub const ALL: [ResolverClass; 8] = [
52 ResolverClass::Macro,
53 ResolverClass::Include,
54 ResolverClass::Behaviour,
55 ResolverClass::QualifiedCall,
56 ResolverClass::Record,
57 ResolverClass::LocalCall,
58 ResolverClass::Type,
59 ResolverClass::IndirectCall,
60 ];
61
62 #[must_use]
70 pub fn is_covered(self) -> bool {
71 match self {
72 ResolverClass::Macro
73 | ResolverClass::Include
74 | ResolverClass::Behaviour
75 | ResolverClass::QualifiedCall
76 | ResolverClass::Record
77 | ResolverClass::LocalCall
78 | ResolverClass::Type
79 | ResolverClass::IndirectCall => true,
80 }
81 }
82
83 #[must_use]
87 pub fn of_symbol_kind(kind: &SymbolKind) -> ResolverClass {
88 match kind {
89 SymbolKind::Macro { .. } => ResolverClass::Macro,
90 SymbolKind::Record { .. } => ResolverClass::Record,
91 SymbolKind::Behaviour { .. } | SymbolKind::Callback { .. } => ResolverClass::Behaviour,
92 SymbolKind::Type { .. } => ResolverClass::Type,
93 SymbolKind::Function { .. } | SymbolKind::FunctionAnyArity { .. } => {
94 ResolverClass::QualifiedCall
95 }
96 }
97 }
98}
99
100#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
105#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
106pub struct ResolverCoverage {
107 checked: BTreeSet<ResolverClass>,
108}
109
110impl ResolverCoverage {
111 #[must_use]
113 pub fn current() -> Self {
114 Self {
115 checked: ResolverClass::ALL
116 .into_iter()
117 .filter(|c| c.is_covered())
118 .collect(),
119 }
120 }
121
122 #[must_use]
124 pub fn is_checked(&self, class: ResolverClass) -> bool {
125 self.checked.contains(&class)
126 }
127
128 pub fn unchecked(&self) -> impl Iterator<Item = ResolverClass> + '_ {
131 ResolverClass::ALL
132 .into_iter()
133 .filter(|c| !self.checked.contains(c))
134 }
135}