rune/compile/
prelude.rs
1use core::ops::Deref;
2
3use crate::alloc::{self, Box, HashMap};
4use crate::item::{IntoComponent, Item, ItemBuf};
5
6#[derive(Default)]
8pub struct Prelude {
9 prelude: HashMap<Box<str>, ItemBuf>,
11}
12
13impl Prelude {
14 pub(crate) fn with_default_prelude() -> alloc::Result<Self> {
16 let mut this = Self::default();
17
18 this.add_prelude("Type", ["any", "Type"])?;
19 this.add_prelude("assert_eq", ["test", "assert_eq"])?;
20 this.add_prelude("assert_ne", ["test", "assert_ne"])?;
21 this.add_prelude("assert", ["test", "assert"])?;
22 this.add_prelude("bool", ["bool"])?;
23 this.add_prelude("u8", ["u8"])?;
24 this.add_prelude("f64", ["f64"])?;
25 this.add_prelude("i64", ["i64"])?;
26 this.add_prelude("u64", ["u64"])?;
27 this.add_prelude("char", ["char"])?;
28 this.add_prelude("dbg", ["io", "dbg"])?;
29 this.add_prelude("drop", ["mem", "drop"])?;
30 this.add_prelude("clone", ["clone", "clone"])?;
31 this.add_prelude("Err", ["result", "Result", "Err"])?;
32 this.add_prelude("file", ["macros", "builtin", "file"])?;
33 this.add_prelude("format", ["fmt", "format"])?;
34 this.add_prelude("is_readable", ["is_readable"])?;
35 this.add_prelude("is_writable", ["is_writable"])?;
36 this.add_prelude("line", ["macros", "builtin", "line"])?;
37 this.add_prelude("None", ["option", "Option", "None"])?;
38 this.add_prelude("Tuple", ["tuple", "Tuple"])?;
39 this.add_prelude("Object", ["object", "Object"])?;
40 this.add_prelude("Ok", ["result", "Result", "Ok"])?;
41 this.add_prelude("Option", ["option", "Option"])?;
42 this.add_prelude("panic", ["panic"])?;
43 this.add_prelude("print", ["io", "print"])?;
44 this.add_prelude("println", ["io", "println"])?;
45 this.add_prelude("Result", ["result", "Result"])?;
46 this.add_prelude("Some", ["option", "Option", "Some"])?;
47 this.add_prelude("String", ["string", "String"])?;
48 this.add_prelude("stringify", ["stringify"])?;
49 this.add_prelude("Vec", ["vec", "Vec"])?;
50 this.add_prelude("Bytes", ["bytes", "Bytes"])?;
51
52 Ok(this)
53 }
54
55 pub(crate) fn get<'a>(&'a self, name: &str) -> Option<&'a Item> {
57 Some(self.prelude.get(name)?)
58 }
59
60 #[allow(dead_code)]
62 pub(crate) fn get_local<'a>(&'a self, item: &ItemBuf) -> Option<&'a str> {
63 self.prelude
64 .iter()
65 .find(|(_, i)| i == &item)
66 .map(|(s, _)| s.deref())
67 }
68
69 fn add_prelude<I>(&mut self, local: &str, path: I) -> alloc::Result<()>
71 where
72 I: IntoIterator,
73 I::Item: IntoComponent,
74 {
75 self.prelude
76 .try_insert(local.try_into()?, ItemBuf::with_crate_item("std", path)?)?;
77 Ok(())
78 }
79}