cas_parser/parser/ast/
range.rs1use crate::parser::{ast::expr::Expr, fmt::Latex};
2use std::fmt;
3
4#[cfg(feature = "serde")]
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq)]
9#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
10pub enum RangeKind {
11 HalfOpen,
13
14 Closed,
16}
17
18#[derive(Debug, Clone, PartialEq, Eq)]
21#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
22pub struct Range {
23 pub start: Box<Expr>,
25
26 pub end: Box<Expr>,
28
29 pub kind: RangeKind,
31
32 pub span: std::ops::Range<usize>,
34}
35
36impl Range {
37 pub fn span(&self) -> std::ops::Range<usize> {
39 self.span.clone()
40 }
41}
42
43impl std::fmt::Display for Range {
44 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
45 match self.kind {
46 RangeKind::HalfOpen => write!(f, "{} .. {}", self.start, self.end),
47 RangeKind::Closed => write!(f, "{} ..= {}", self.start, self.end),
48 }
49 }
50}
51
52impl Latex for Range {
53 fn fmt_latex(&self, f: &mut fmt::Formatter) -> fmt::Result {
54 match self.kind {
55 RangeKind::HalfOpen => write!(f, "\\left[{}, {}\\right)", self.start, self.end),
56 RangeKind::Closed => write!(f, "\\left[{}, {}\\right]", self.start, self.end),
57 }
58 }
59}