tiger_lib/block/
bv.rs

1use crate::block::Block;
2use crate::report::{ErrorKey, err};
3use crate::token::Token;
4
5/// `BV` is an component a `Field`, which represents keyed items in `Block`.
6/// It is itself either a `Block` or a single-token `Value`.
7#[derive(Clone, Debug)]
8pub enum BV {
9    Value(Token),
10    Block(Block),
11}
12
13impl BV {
14    pub fn get_block(&self) -> Option<&Block> {
15        match self {
16            BV::Value(_) => None,
17            BV::Block(b) => Some(b),
18        }
19    }
20
21    pub fn get_value(&self) -> Option<&Token> {
22        match self {
23            BV::Value(t) => Some(t),
24            BV::Block(_) => None,
25        }
26    }
27
28    pub fn expect_block(&self) -> Option<&Block> {
29        match self {
30            BV::Value(_) => {
31                err(ErrorKey::Structure).msg("expected block, found value").loc(self).push();
32                None
33            }
34            BV::Block(b) => Some(b),
35        }
36    }
37
38    pub fn expect_value(&self) -> Option<&Token> {
39        match self {
40            BV::Value(t) => Some(t),
41            BV::Block(_) => {
42                err(ErrorKey::Structure).msg("expected value, found block").loc(self).push();
43                None
44            }
45        }
46    }
47
48    #[allow(dead_code)] // It's here for symmetry
49    pub fn into_value(self) -> Option<Token> {
50        match self {
51            BV::Value(t) => Some(t),
52            BV::Block(_) => None,
53        }
54    }
55
56    pub fn expect_into_value(self) -> Option<Token> {
57        match self {
58            BV::Value(t) => Some(t),
59            BV::Block(_) => {
60                err(ErrorKey::Structure).msg("expected value, found block").loc(self).push();
61                None
62            }
63        }
64    }
65
66    pub fn into_block(self) -> Option<Block> {
67        match self {
68            BV::Value(_) => None,
69            BV::Block(b) => Some(b),
70        }
71    }
72
73    #[allow(dead_code)] // It's here for symmetry
74    pub fn expect_into_block(self) -> Option<Block> {
75        match self {
76            BV::Value(_) => {
77                err(ErrorKey::Structure).msg("expected block, found value").loc(self).push();
78                None
79            }
80            BV::Block(b) => Some(b),
81        }
82    }
83
84    pub fn equivalent(&self, other: &Self) -> bool {
85        match self {
86            BV::Value(t1) => {
87                if let Some(t2) = other.get_value() {
88                    t1.is(t2.as_str())
89                } else {
90                    false
91                }
92            }
93            BV::Block(b1) => {
94                if let Some(b2) = other.get_block() {
95                    b1.equivalent(b2)
96                } else {
97                    false
98                }
99            }
100        }
101    }
102}