rustpython_vm/stdlib/
warnings.rs

1pub(crate) use _warnings::make_module;
2
3use crate::{builtins::PyType, Py, PyResult, VirtualMachine};
4
5pub fn warn(
6    category: &Py<PyType>,
7    message: String,
8    stack_level: usize,
9    vm: &VirtualMachine,
10) -> PyResult<()> {
11    // TODO: use rust warnings module
12    if let Ok(module) = vm.import("warnings", 0) {
13        if let Ok(func) = module.get_attr("warn", vm) {
14            let _ = func.call((message, category.to_owned(), stack_level), vm);
15        }
16    }
17    Ok(())
18}
19
20#[pymodule]
21mod _warnings {
22    use crate::{
23        builtins::{PyStrRef, PyTypeRef},
24        function::OptionalArg,
25        PyResult, VirtualMachine,
26    };
27
28    #[derive(FromArgs)]
29    struct WarnArgs {
30        #[pyarg(positional)]
31        message: PyStrRef,
32        #[pyarg(any, optional)]
33        category: OptionalArg<PyTypeRef>,
34        #[pyarg(any, optional)]
35        stacklevel: OptionalArg<u32>,
36    }
37
38    #[pyfunction]
39    fn warn(args: WarnArgs, vm: &VirtualMachine) -> PyResult<()> {
40        let level = args.stacklevel.unwrap_or(1);
41        crate::warn::warn(
42            args.message,
43            args.category.into_option(),
44            level as isize,
45            None,
46            vm,
47        )
48    }
49}