1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#[macro_export]
macro_rules! try_vec {
    () => (
        $crate::vec::Vec::new()
    );

    ($elem:expr; $n:expr) => (
        $crate::vec::try_from_elem($elem, $n)?
    );

    ($($x:expr),+ $(,)?) => (
        $crate::slice::into_vec(
            // This rustc_box is not required, but it produces a dramatic improvement in compile
            // time when constructing arrays with many elements.
            $crate::boxed::Box::try_from([$($x),+])?
        )
    );
}

/// Creates a `String` using interpolation of runtime expressions.
///
/// The first argument `try_format!` receives is a format string. This must be a
/// string literal. The power of the formatting string is in the `{}`s
/// contained.
///
/// Additional parameters passed to `try_format!` replace the `{}`s within the
/// formatting string in the order given unless named or positional parameters
/// are used; see [`std::fmt`] for more information.
///
/// A common use for `try_format!` is concatenation and interpolation of
/// strings. The same convention is used with [`print!`] and [`write!`] macros,
/// depending on the intended destination of the string.
///
/// To convert a single value to a string, use the [`try_to_string`] method.
/// This will use the [`Display`] formatting trait.
///
/// [`std::fmt`]: ../std/fmt/index.html
/// [`print!`]: ../std/macro.print.html
/// [`write!`]: core::write
/// [`try_to_string`]: crate::string::TryToString
/// [`Display`]: core::fmt::Display
///
/// # Panics
///
/// `try_format!` panics if a formatting trait implementation returns an error. This
/// indicates an incorrect implementation since `fmt::Write for String` never
/// returns an error itself.
///
/// # Examples
///
/// ```
/// use rune::alloc::try_format;
///
/// try_format!("test");
/// try_format!("hello {}", "world!");
/// try_format!("x = {}, y = {y}", 10, y = 30);
/// let (x, y) = (1, 2);
/// try_format!("{x} + {y} = 3");
/// # Ok::<_, rune::alloc::Error>(())
/// ```
#[macro_export]
macro_rules! try_format {
    ($($tt:tt)*) => {
        $crate::fmt::try_format(format_args!($($tt)*))?
    };
}