use crate::ast::Ast;
use crate::compile::CompiledExpr;
use crate::value::BaseEnv;
use rustyfi_syntax::Span;
use std::rc::Rc;
#[allow(private_interfaces)]
#[derive(Clone, Debug)]
pub struct CmdArg {
pub opts: Vec<(String, CompiledExpr)>,
pub arg: CompiledExpr,
}
#[allow(private_interfaces)]
#[derive(Clone, Debug)]
pub enum IText {
Text(String),
CodeText(String),
Cmd {
cmd: CompiledExpr,
args: Vec<CmdArg>,
},
Embed {
expr: CompiledExpr,
span: Span,
},
EmbedMath {
elems: Rc<Vec<MathElem>>,
span: Span,
},
}
#[allow(private_interfaces)]
#[derive(Clone, Debug)]
pub enum BText {
Cmd {
cmd: CompiledExpr,
args: Vec<CmdArg>,
},
Embed {
expr: CompiledExpr,
span: Span,
},
}
#[allow(private_interfaces)]
#[derive(Clone, Debug)]
pub enum MathElem {
Chars(String),
Group(Vec<MathElem>),
Sub(Box<MathElem>, Vec<MathElem>),
Sup(Box<MathElem>, Vec<MathElem>),
Primes(Box<MathElem>, usize),
Cmd {
cmd: CompiledExpr,
name: Rc<str>,
span: Span,
args: Vec<CmdArg>,
},
Embed {
expr: CompiledExpr,
span: Span,
},
}
impl IText {
pub fn embed(expr: &Ast, env: &BaseEnv, span: Span) -> IText {
IText::Embed {
expr: crate::compile::compile_program(expr, env),
span,
}
}
}