use std::collections::HashMap;
use crate::span::Span;
#[derive(Debug, Clone)]
pub struct EventInfo {
pub span: Span,
pub field_names: Vec<String>,
}
#[derive(Debug, Clone)]
pub struct StreamInfo {
pub span: Span,
}
#[derive(Debug, Clone)]
pub struct FunctionInfo {
pub span: Span,
pub param_count: usize,
}
#[derive(Debug, Clone)]
pub struct ConnectorInfo {
pub span: Span,
pub connector_type: String,
}
#[derive(Debug, Clone)]
pub struct ContextInfo {
pub span: Span,
}
#[derive(Debug, Clone)]
pub struct PatternInfo {
pub span: Span,
}
#[derive(Debug, Clone)]
pub struct VarInfo {
pub span: Span,
pub mutable: bool,
}
#[derive(Debug, Clone)]
pub struct TypeInfo {
pub span: Span,
pub fields: Vec<(String, crate::types::Type)>,
}
#[derive(Debug)]
pub struct SymbolTable {
pub events: HashMap<String, EventInfo>,
pub streams: HashMap<String, StreamInfo>,
pub functions: HashMap<String, FunctionInfo>,
pub connectors: HashMap<String, ConnectorInfo>,
pub contexts: HashMap<String, ContextInfo>,
pub patterns: HashMap<String, PatternInfo>,
pub variables: HashMap<String, VarInfo>,
pub types: HashMap<String, TypeInfo>,
}
impl Default for SymbolTable {
fn default() -> Self {
Self::new()
}
}
impl SymbolTable {
pub fn new() -> Self {
Self {
events: HashMap::new(),
streams: HashMap::new(),
functions: HashMap::new(),
connectors: HashMap::new(),
contexts: HashMap::new(),
patterns: HashMap::new(),
variables: HashMap::new(),
types: HashMap::new(),
}
}
pub fn is_declared(&self, name: &str) -> bool {
self.events.contains_key(name)
|| self.streams.contains_key(name)
|| self.functions.contains_key(name)
|| self.connectors.contains_key(name)
|| self.contexts.contains_key(name)
|| self.patterns.contains_key(name)
|| self.variables.contains_key(name)
|| self.types.contains_key(name)
}
pub fn all_names(&self) -> Vec<&str> {
let mut names: Vec<&str> = Vec::new();
for k in self.events.keys() {
names.push(k);
}
for k in self.streams.keys() {
names.push(k);
}
for k in self.functions.keys() {
names.push(k);
}
for k in self.connectors.keys() {
names.push(k);
}
for k in self.contexts.keys() {
names.push(k);
}
for k in self.patterns.keys() {
names.push(k);
}
for k in self.variables.keys() {
names.push(k);
}
for k in self.types.keys() {
names.push(k);
}
names
}
pub fn connector_names(&self) -> Vec<&str> {
self.connectors.keys().map(|s| s.as_str()).collect()
}
pub fn context_names(&self) -> Vec<&str> {
self.contexts.keys().map(|s| s.as_str()).collect()
}
pub fn source_names(&self) -> Vec<&str> {
let mut names: Vec<&str> = Vec::new();
for k in self.events.keys() {
names.push(k);
}
for k in self.streams.keys() {
names.push(k);
}
names
}
pub fn function_names(&self) -> Vec<&str> {
self.functions.keys().map(|s| s.as_str()).collect()
}
pub fn event_field_names(&self, event_name: &str) -> Option<&[String]> {
self.events
.get(event_name)
.map(|e| e.field_names.as_slice())
}
}