xbp_analysis/domain/
capabilities.rs1use serde::{Deserialize, Serialize};
4use std::collections::BTreeSet;
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
8#[serde(rename_all = "snake_case")]
9pub enum Capability {
10 Ast,
11 TypeInfo,
12 ControlFlowGraph,
13 ErrorFlow,
14 CallSites,
15 ExceptionOrResult,
16 MacroAwareness,
17 SourceRewrite,
18 AsyncConcurrency,
19 GeneratedCodeAwareness,
20}
21
22impl Capability {
23 pub fn as_str(self) -> &'static str {
24 match self {
25 Self::Ast => "ast",
26 Self::TypeInfo => "type_info",
27 Self::ControlFlowGraph => "control_flow_graph",
28 Self::ErrorFlow => "error_flow",
29 Self::CallSites => "call_sites",
30 Self::ExceptionOrResult => "exception_or_result",
31 Self::MacroAwareness => "macro_awareness",
32 Self::SourceRewrite => "source_rewrite",
33 Self::AsyncConcurrency => "async_concurrency",
34 Self::GeneratedCodeAwareness => "generated_code_awareness",
35 }
36 }
37}
38
39#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
40pub struct CapabilitySet {
41 pub caps: BTreeSet<Capability>,
42}
43
44impl CapabilitySet {
45 pub fn new(caps: impl IntoIterator<Item = Capability>) -> Self {
46 Self {
47 caps: caps.into_iter().collect(),
48 }
49 }
50
51 pub fn contains(&self, c: Capability) -> bool {
52 self.caps.contains(&c)
53 }
54
55 pub fn is_superset_of(&self, required: &CapabilitySet) -> bool {
56 required.caps.is_subset(&self.caps)
57 }
58
59 pub fn rust_syn_default() -> Self {
60 Self::new([
61 Capability::Ast,
62 Capability::ErrorFlow,
63 Capability::CallSites,
64 Capability::ExceptionOrResult,
65 Capability::MacroAwareness,
66 Capability::AsyncConcurrency,
67 Capability::GeneratedCodeAwareness,
68 Capability::SourceRewrite,
70 ])
71 }
72}