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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
/*
* Copyright (c) godot-rust; Bromeon and contributors.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
//! Printing and logging functionality.
// https://stackoverflow.com/a/40234666
#[macro_export]
#[doc(hidden)]
macro_rules! inner_function {
() => {{
fn f() {}
fn type_name_of<T>(_: T) -> &'static str {
std::any::type_name::<T>()
}
let name = type_name_of(f);
name.strip_suffix("::f").unwrap()
}};
}
#[macro_export]
#[doc(hidden)]
macro_rules! inner_godot_msg {
// FIXME expr needs to be parenthesised, see usages
($godot_fn:ident; $fmt:literal $(, $args:expr)* $(,)?) => {
//($($args:tt),* $(,)?) => {
unsafe {
let msg = format!("{}\0", format_args!($fmt $(, $args)*));
// assert!(msg.is_ascii(), "godot_error: message must be ASCII");
// Check whether engine is loaded, otherwise fall back to stderr.
if $crate::sys::is_initialized() {
let function = format!("{}\0", $crate::inner_function!());
$crate::sys::interface_fn!($godot_fn)(
$crate::sys::c_str_from_str(&msg),
$crate::sys::c_str_from_str(&function),
$crate::sys::c_str_from_str(concat!(file!(), "\0")),
line!() as i32,
false as $crate::sys::GDExtensionBool, // whether to create a toast notification in editor
);
} else {
eprintln!("[{}] {}", stringify!($godot_fn), &msg[..msg.len() - 1]);
}
}
};
}
/// Pushes a warning message to Godot's built-in debugger and to the OS terminal.
///
/// _Godot equivalent: [`@GlobalScope.push_warning()`](https://docs.godotengine.org/en/stable/classes/class_@globalscope.html#class-globalscope-method-push-warning)_.
#[macro_export]
macro_rules! godot_warn {
($fmt:literal $(, $args:expr)* $(,)?) => {
$crate::inner_godot_msg!(print_warning; $fmt $(, $args)*);
};
}
/// Pushes an error message to Godot's built-in debugger and to the OS terminal.
///
/// _Godot equivalent: [`@GlobalScope.push_error()`](https://docs.godotengine.org/en/stable/classes/class_@globalscope.html#class-globalscope-method-push-error)_.
#[macro_export]
macro_rules! godot_error {
($fmt:literal $(, $args:expr)* $(,)?) => {
$crate::inner_godot_msg!(print_error; $fmt $(, $args)*);
};
}
/// Logs a script error to Godot's built-in debugger and to the OS terminal.
#[macro_export]
macro_rules! godot_script_error {
($fmt:literal $(, $args:expr)* $(,)?) => {
$crate::inner_godot_msg!(print_script_error; $fmt $(, $args)*);
};
}
/// Prints to the Godot console.
///
/// _Godot equivalent: [`@GlobalScope.print()`](https://docs.godotengine.org/en/stable/classes/class_@globalscope.html#class-globalscope-method-print)_.
#[macro_export]
macro_rules! godot_print {
($fmt:literal $(, $args:expr)* $(,)?) => {
$crate::global::print(&[
$crate::builtin::Variant::from(
format!($fmt $(, $args)*)
)
])
};
}
/// Prints to the Godot console. Supports BBCode, color and URL tags.
///
/// Slower than [`godot_print!`].
///
/// _Godot equivalent: [`@GlobalScope.print_rich()`](https://docs.godotengine.org/en/stable/classes/class_@globalscope.html#class-globalscope-method-print-rich)_.
#[macro_export]
macro_rules! godot_print_rich {
($fmt:literal $(, $args:expr)* $(,)?) => {
$crate::global::print_rich(&[
$crate::builtin::Variant::from(
format!($fmt $(, $args)*)
)
])
};
}