1use crate::symbol::Symbol;
4#[cfg(feature = "serialization")]
5use serde::{Deserialize, Serialize};
6use std::borrow::Cow;
7
8#[derive(Debug, Clone)]
13#[cfg_attr(feature = "serialization", derive(Serialize, Deserialize))]
14pub struct SymbolMetadata {
15 pub name: Cow<'static, str>,
17 pub kind: SymbolKind,
19 pub local: bool,
21 #[cfg_attr(feature = "serialization", serde(skip))]
23 pub index: Option<usize>,
24}
25
26#[derive(Debug, Clone, PartialEq, Eq)]
28#[cfg_attr(feature = "serialization", derive(Serialize, Deserialize))]
29pub enum SymbolKind {
30 Const,
32 Func {
34 arity: usize,
36 variadic: bool,
38 },
39}
40
41impl From<&Symbol> for SymbolKind {
42 fn from(symbol: &Symbol) -> Self {
43 match symbol {
44 Symbol::Const { .. } => SymbolKind::Const,
45 Symbol::Func { args, variadic, .. } => SymbolKind::Func {
46 arity: *args,
47 variadic: *variadic,
48 },
49 }
50 }
51}
52
53impl From<&Symbol> for SymbolMetadata {
54 fn from(symbol: &Symbol) -> Self {
55 SymbolMetadata {
56 name: symbol.name().to_string().into(),
57 kind: symbol.into(),
58 local: symbol.is_local(),
59 index: None,
60 }
61 }
62}