use serde::Serialize;
use crate::model::{Expression, SourceLocation, Statement};
#[derive(Debug, Clone, Serialize)]
pub struct CaseLabel {
#[serde(skip_serializing_if = "Option::is_none")]
pub value: Option<Expression>,
pub location: SourceLocation,
}
#[derive(Debug, Clone, Serialize)]
pub struct SwitchCase {
pub label: CaseLabel,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub body: Vec<Statement>,
}
#[derive(Debug, Clone, Serialize)]
pub struct SwitchStatement {
pub condition: Expression,
#[serde(skip)]
pub condition_location: SourceLocation,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub cases: Vec<SwitchCase>,
pub location: SourceLocation,
}
impl SwitchStatement {
pub fn case_identifiers(&self) -> Vec<&str> {
self.cases
.iter()
.filter_map(|case| case.label.value.as_ref())
.filter_map(|expr| {
if let Expression::Identifier(id) = expr {
Some(id.name.as_str())
} else {
None
}
})
.collect()
}
pub fn has_default_case(&self) -> bool {
self.default_case().is_some()
}
pub fn all_statements(&self) -> impl Iterator<Item = &Statement> {
self.cases.iter().flat_map(|case| case.body.iter())
}
pub fn default_case(&self) -> Option<&SwitchCase> {
self.cases.iter().find(|case| case.label.value.is_none())
}
}