use serde::{Deserialize, Serialize};
use std::collections::BTreeSet;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Capability {
Ast,
TypeInfo,
ControlFlowGraph,
ErrorFlow,
CallSites,
ExceptionOrResult,
MacroAwareness,
SourceRewrite,
AsyncConcurrency,
GeneratedCodeAwareness,
}
impl Capability {
pub fn as_str(self) -> &'static str {
match self {
Self::Ast => "ast",
Self::TypeInfo => "type_info",
Self::ControlFlowGraph => "control_flow_graph",
Self::ErrorFlow => "error_flow",
Self::CallSites => "call_sites",
Self::ExceptionOrResult => "exception_or_result",
Self::MacroAwareness => "macro_awareness",
Self::SourceRewrite => "source_rewrite",
Self::AsyncConcurrency => "async_concurrency",
Self::GeneratedCodeAwareness => "generated_code_awareness",
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct CapabilitySet {
pub caps: BTreeSet<Capability>,
}
impl CapabilitySet {
pub fn new(caps: impl IntoIterator<Item = Capability>) -> Self {
Self {
caps: caps.into_iter().collect(),
}
}
pub fn contains(&self, c: Capability) -> bool {
self.caps.contains(&c)
}
pub fn is_superset_of(&self, required: &CapabilitySet) -> bool {
required.caps.is_subset(&self.caps)
}
pub fn rust_syn_default() -> Self {
Self::new([
Capability::Ast,
Capability::ErrorFlow,
Capability::CallSites,
Capability::ExceptionOrResult,
Capability::MacroAwareness,
Capability::AsyncConcurrency,
Capability::GeneratedCodeAwareness,
Capability::SourceRewrite,
])
}
}