rune/modules/macros/
builtin.rs

1//! Built-in macros.
2
3use crate as rune;
4use crate::compile;
5use crate::macros::{quote, MacroContext, TokenStream};
6use crate::parse::Parser;
7use crate::{ContextError, Module};
8
9/// Built-in macros.
10#[rune::module(::std::macros::builtin)]
11pub fn module() -> Result<Module, ContextError> {
12    let mut builtins = Module::from_meta(self::module_meta)?.with_unique("std::macros::builtin");
13    builtins.macro_meta(file)?;
14    builtins.macro_meta(line)?;
15    Ok(builtins)
16}
17
18/// Return the line in the current file.
19///
20/// # Examples
21///
22/// ```rune
23/// println!("{}:{}: Something happened", file!(), line!());
24/// ```
25#[rune::macro_]
26pub(crate) fn line(
27    cx: &mut MacroContext<'_, '_, '_>,
28    stream: &TokenStream,
29) -> compile::Result<TokenStream> {
30    use crate as rune;
31
32    let mut parser = Parser::from_token_stream(stream, cx.input_span());
33    parser.eof()?;
34
35    let stream = quote!(
36        #[builtin]
37        line!()
38    );
39
40    Ok(stream.into_token_stream(cx)?)
41}
42
43/// Return the name of the current file.
44///
45/// # Examples
46///
47/// ```rune
48/// println!("{}:{}: Something happened", file!(), line!());
49/// ```
50#[rune::macro_]
51pub(crate) fn file(
52    cx: &mut MacroContext<'_, '_, '_>,
53    stream: &TokenStream,
54) -> compile::Result<TokenStream> {
55    use crate as rune;
56
57    let mut parser = Parser::from_token_stream(stream, cx.input_span());
58    parser.eof()?;
59
60    let stream = quote!(
61        #[builtin]
62        file!()
63    );
64
65    Ok(stream.into_token_stream(cx)?)
66}