use crate::symbol::Symbol;
#[cfg(feature = "serialization")]
use serde::{Deserialize, Serialize};
use std::borrow::Cow;
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serialization", derive(Serialize, Deserialize))]
pub struct SymbolMetadata {
pub name: Cow<'static, str>,
pub kind: SymbolKind,
pub local: bool,
#[cfg_attr(feature = "serialization", serde(skip))]
pub index: Option<usize>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serialization", derive(Serialize, Deserialize))]
pub enum SymbolKind {
Const,
Func {
arity: usize,
variadic: bool,
},
}
impl From<&Symbol> for SymbolKind {
fn from(symbol: &Symbol) -> Self {
match symbol {
Symbol::Const { .. } => SymbolKind::Const,
Symbol::Func { args, variadic, .. } => SymbolKind::Func {
arity: *args,
variadic: *variadic,
},
}
}
}
impl From<&Symbol> for SymbolMetadata {
fn from(symbol: &Symbol) -> Self {
SymbolMetadata {
name: symbol.name().to_string().into(),
kind: symbol.into(),
local: symbol.is_local(),
index: None,
}
}
}