interpreter/types/
alloc.rs

1use crate::error;
2
3use super::BufValue;
4
5pub fn mkbuf(data: &str, file: &str) -> BufValue {
6  let (_, val) = data.split_at(1);
7
8  let (header, value) = val.split_at(1);
9
10  match header {
11    "'" => {
12      // Check if decimal
13      if value.contains(".") {
14        BufValue::Float(value.parse().unwrap())
15      }
16      // Check if unsigned
17      else if let Ok(v) = value.parse() {
18        BufValue::U_Int(v)
19      }
20      // Otherwise
21      else {
22        BufValue::Int(value.parse().unwrap())
23      }
24    }
25    "f" => BufValue::Float(value.parse().unwrap()),
26    "u" => BufValue::U_Int(value.parse().unwrap()),
27    "i" => BufValue::Int(value.parse().unwrap()),
28    "s" => {
29      if !val.ends_with("\"") {
30        error("Unknown String closing, expected `\"`", file);
31      }
32      if !val.starts_with("\"") {
33        error("Unknown String starting, expected `\"`", file);
34      }
35      BufValue::Str(val[2..].into())
36    }
37    "1" => BufValue::Bool(true),
38    "0" => BufValue::Bool(false),
39    e => {
40      error(format!("Unknown header `{}` used", e), file);
41    }
42  }
43}