1use crate::block::Block;
2use crate::report::{ErrorKey, err};
3use crate::token::Token;
4
5#[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)] 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)] 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}