use alloc::vec::Vec;
use super::*;
#[derive(Debug, Clone, Default)]
pub struct SchemaBlock<'a> {
pub span_range: SpanRange,
pub input: &'a str,
pub blocks: Vec<TopLevelBlock>,
}
#[derive(Debug, Clone)]
pub enum TopLevelBlock {
Project(ProjectBlock),
Table(TableBlock),
TableGroup(TableGroupBlock),
Note(NoteBlock),
Ref(RefBlock),
Enum(EnumBlock),
}
impl<'a> SchemaBlock<'a> {
pub fn projects(&self) -> Vec<&ProjectBlock> {
self
.blocks
.iter()
.filter_map(|block| {
if let TopLevelBlock::Project(project) = block {
Some(project)
} else {
None
}
})
.collect()
}
pub fn tables(&self) -> Vec<&TableBlock> {
self
.blocks
.iter()
.filter_map(|block| {
if let TopLevelBlock::Table(table) = block {
Some(table)
} else {
None
}
})
.collect()
}
pub fn table_groups(&self) -> Vec<&TableGroupBlock> {
self
.blocks
.iter()
.filter_map(|block| {
if let TopLevelBlock::TableGroup(table_group) = block {
Some(table_group)
} else {
None
}
})
.collect()
}
pub fn notes(&self) -> Vec<&NoteBlock> {
self
.blocks
.iter()
.filter_map(|block| {
if let TopLevelBlock::Note(note_block) = block {
Some(note_block)
} else {
None
}
})
.collect()
}
pub fn refs(&self) -> Vec<&RefBlock> {
self
.blocks
.iter()
.filter_map(|block| {
if let TopLevelBlock::Ref(reference) = block {
Some(reference)
} else {
None
}
})
.collect()
}
pub fn enums(&self) -> Vec<&EnumBlock> {
self
.blocks
.iter()
.filter_map(|block| {
if let TopLevelBlock::Enum(enum_block) = block {
Some(enum_block)
} else {
None
}
})
.collect()
}
}