neutralts/bif/
parse_bif_var.rs1#![doc = include_str!("../../doc/bif-var.md")]
2
3use crate::{bif::constants::*, bif::Bif, bif::BifError, constants::*, utils::*};
4
5impl<'a> Bif<'a> {
6 pub(crate) fn parse_bif_var(&mut self) -> Result<(), BifError> {
11 if self.mod_scope {
12 return Err(self.bif_error(BIF_ERROR_MODIFIER_NOT_ALLOWED));
13 }
14
15 if self.src.is_empty() {
17 self.alias = "unprintable".to_string();
20
21 self.out = UNPRINTABLE.to_string();
22
23 return Ok(());
24 }
25
26 self.alias = "var".to_string();
28 let var_name;
29
30 if self.src.contains(BIF_OPEN) {
32 if !self.contains_allow(&self.src) {
33 self.out = EMPTY_STRING;
34
35 return Err(self.bif_error(BIF_ERROR_INSECURE_VARNAME));
36 }
37
38 var_name = new_child_parse!(self, &self.src, self.mod_scope);
39 } else {
40 var_name = self.src.clone();
41 }
42
43 self.out = self.get_data(&var_name);
44
45 if (self.mod_filter || self.shared.filter_all) && !self.mod_negate {
46 if !var_name.starts_with("CONTEXT->") {
47 self.out = escape_chars(&unescape_chars(&self.out, true), true).into_owned();
49 }
50 } else {
51 if self.shared.filter_bifs {
52 self.out = self.out.replace(BIF_OPEN, BIF_SANITIZE_OPEN);
54 self.out = self.out.replace(BIF_CLOSE, BIF_SANITIZE_CLOSE);
55 }
56 }
57
58 if self.mod_negate && !self.shared.filter_bifs && var_name.starts_with("CONTEXT->") {
59 self.out = unescape_chars(&self.out, true).into_owned();
60 }
61
62 Ok(())
63 }
64}
65
66#[cfg(test)]
67#[path = "parse_bif_var_tests.rs"]
68mod tests;