1#![doc = include_str!("readme.md")]
2use core::range::Range;
3
4#[derive(Debug, Clone)]
6#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7pub struct TclRoot {
8 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
10 pub span: Range<usize>,
11 pub items: Vec<TclItem>,
13}
14
15#[derive(Debug, Clone)]
17#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
18pub enum TclItem {
19 Command(TclCommand),
21 Comment(TclComment),
23}
24
25#[derive(Debug, Clone)]
27#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
28pub struct TclCommand {
29 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
31 pub span: Range<usize>,
32 pub words: Vec<TclWord>,
34}
35
36#[derive(Debug, Clone)]
38#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
39pub enum TclWord {
40 Simple(String),
42 Variable(String),
44 Script(TclRoot),
46 Braced(String),
48}
49
50#[derive(Debug, Clone)]
52#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
53pub struct TclComment {
54 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
56 pub span: Range<usize>,
57 pub text: String,
59}
60
61impl TclRoot {
62 pub fn new(span: Range<usize>) -> Self {
64 Self { span, items: Vec::new() }
65 }
66}