rune/compile/
prelude.rs

1use core::ops::Deref;
2
3use crate::alloc::{self, Box, HashMap};
4use crate::item::{IntoComponent, Item, ItemBuf};
5
6/// The contents of a prelude.
7#[derive(Default)]
8pub struct Prelude {
9    /// Prelude imports.
10    prelude: HashMap<Box<str>, ItemBuf>,
11}
12
13impl Prelude {
14    /// Construct a new unit with the default prelude.
15    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    /// Access a value from the prelude.
56    pub(crate) fn get<'a>(&'a self, name: &str) -> Option<&'a Item> {
57        Some(self.prelude.get(name)?)
58    }
59
60    /// Return the local name of an item
61    #[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    /// Define a prelude item.
70    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}