diff --git a/stdlib/src/lib.rs b/stdlib/src/lib.rs index 9ee8e3e81d..e9d10dfde4 100644 --- a/stdlib/src/lib.rs +++ b/stdlib/src/lib.rs @@ -33,6 +33,7 @@ mod pyexpat; mod pystruct; mod random; mod statistics; +mod suggestions; // TODO: maybe make this an extension module, if we ever get those // mod re; #[cfg(feature = "bz2")] @@ -133,6 +134,7 @@ pub fn get_module_inits() -> impl Iterator, StdlibInit "unicodedata" => unicodedata::make_module, "zlib" => zlib::make_module, "_statistics" => statistics::make_module, + "suggestions" => suggestions::make_module, // crate::vm::sysmodule::sysconfigdata_name() => sysconfigdata::make_module, } #[cfg(any(unix, target_os = "wasi"))] diff --git a/stdlib/src/suggestions.rs b/stdlib/src/suggestions.rs new file mode 100644 index 0000000000..e49e9dd4a4 --- /dev/null +++ b/stdlib/src/suggestions.rs @@ -0,0 +1,20 @@ +pub(crate) use _suggestions::make_module; + +#[pymodule] +mod _suggestions { + use rustpython_vm::VirtualMachine; + + use crate::vm::PyObjectRef; + + #[pyfunction] + fn _generate_suggestions( + candidates: Vec, + name: PyObjectRef, + vm: &VirtualMachine, + ) -> PyObjectRef { + match crate::vm::suggestion::calculate_suggestions(candidates.iter(), &name) { + Some(suggestion) => suggestion.into(), + None => vm.ctx.none(), + } + } +} diff --git a/vm/src/suggestion.rs b/vm/src/suggestion.rs index 01f53d70ca..3d075ee3bb 100644 --- a/vm/src/suggestion.rs +++ b/vm/src/suggestion.rs @@ -12,7 +12,7 @@ use std::iter::ExactSizeIterator; const MAX_CANDIDATE_ITEMS: usize = 750; -fn calculate_suggestions<'a>( +pub fn calculate_suggestions<'a>( dir_iter: impl ExactSizeIterator, name: &PyObjectRef, ) -> Option {