##// END OF EJS Templates
rust-cpython: pair leaked reference with its manager object...
rust-cpython: pair leaked reference with its manager object Still leak_immutable() is unsafe since leak_handle must live longer than the leaked_ref.

File last commit:

r43109:ce6797ef default
r43116:8f549c46 default
Show More
filepatterns.rs
125 lines | 4.0 KiB | application/rls-services+xml | RustLexer
Raphaël Gomès
rust-filepatterns: add `rust-cpython` bindings for `filepatterns`...
r42515 // filepatterns.rs
//
// Copyright 2019, Georges Racinet <gracinet@anybox.fr>,
// Raphaël Gomès <rgomes@octobus.net>
//
// This software may be used and distributed according to the terms of the
// GNU General Public License version 2 or any later version.
//! Bindings for the `hg::filepatterns` module provided by the
//! `hg-core` crate. From Python, this will be seen as `rustext.filepatterns`
Yuya Nishihara
rust: apply more formatting fixes...
r43109 //! and can be used as replacement for the the pure `filepatterns` Python
//! module.
Raphaël Gomès
rust-filepatterns: add `rust-cpython` bindings for `filepatterns`...
r42515 //!
Raphaël Gomès
rust: switch hg-core and hg-cpython to rust 2018 edition...
r42828 use crate::exceptions::{PatternError, PatternFileError};
Raphaël Gomès
rust-filepatterns: add `rust-cpython` bindings for `filepatterns`...
r42515 use cpython::{
Raphaël Gomès
rust-filepatterns: use bytes instead of String...
r42630 PyBytes, PyDict, PyModule, PyObject, PyResult, PyTuple, Python, ToPyObject,
Raphaël Gomès
rust-filepatterns: add `rust-cpython` bindings for `filepatterns`...
r42515 };
Raphaël Gomès
rust-filepatterns: use bytes instead of String...
r42630 use hg::{build_single_regex, read_pattern_file, LineNumber, PatternTuple};
Raphaël Gomès
rust-filepatterns: add `rust-cpython` bindings for `filepatterns`...
r42515
/// Rust does not like functions with different return signatures.
/// The 3-tuple version is always returned by the hg-core function,
/// the (potential) conversion is handled at this level since it is not likely
/// to have any measurable impact on performance.
///
/// The Python implementation passes a function reference for `warn` instead
/// of a boolean that is used to emit warnings while parsing. The Rust
/// implementation chooses to accumulate the warnings and propagate them to
/// Python upon completion. See the `readpatternfile` function in `match.py`
/// for more details.
fn read_pattern_file_wrapper(
py: Python,
Raphaël Gomès
rust-filepatterns: use bytes instead of String...
r42630 file_path: PyObject,
Raphaël Gomès
rust-filepatterns: add `rust-cpython` bindings for `filepatterns`...
r42515 warn: bool,
source_info: bool,
) -> PyResult<PyTuple> {
Raphaël Gomès
rust-filepatterns: use bytes instead of String...
r42630 match read_pattern_file(file_path.extract::<PyBytes>(py)?.data(py), warn) {
Raphaël Gomès
rust-filepatterns: add `rust-cpython` bindings for `filepatterns`...
r42515 Ok((patterns, warnings)) => {
if source_info {
Raphaël Gomès
rust-filepatterns: use bytes instead of String...
r42630 let itemgetter = |x: &PatternTuple| {
(PyBytes::new(py, &x.0), x.1, PyBytes::new(py, &x.2))
};
let results: Vec<(PyBytes, LineNumber, PyBytes)> =
patterns.iter().map(itemgetter).collect();
Yuya Nishihara
rust-filepatterns: fix type of warnings tuple to (bytes, bytes)...
r42857 return Ok((results, warnings_to_py_bytes(py, &warnings))
.to_py_object(py));
Raphaël Gomès
rust-filepatterns: add `rust-cpython` bindings for `filepatterns`...
r42515 }
Raphaël Gomès
rust-filepatterns: use bytes instead of String...
r42630 let itemgetter = |x: &PatternTuple| PyBytes::new(py, &x.0);
let results: Vec<PyBytes> =
Raphaël Gomès
rust-filepatterns: add `rust-cpython` bindings for `filepatterns`...
r42515 patterns.iter().map(itemgetter).collect();
Yuya Nishihara
rust-filepatterns: fix type of warnings tuple to (bytes, bytes)...
r42857 Ok(
(results, warnings_to_py_bytes(py, &warnings))
.to_py_object(py),
)
Raphaël Gomès
rust-filepatterns: add `rust-cpython` bindings for `filepatterns`...
r42515 }
Err(e) => Err(PatternFileError::pynew(py, e)),
}
}
Yuya Nishihara
rust-filepatterns: fix type of warnings tuple to (bytes, bytes)...
r42857 fn warnings_to_py_bytes(
py: Python,
warnings: &[(Vec<u8>, Vec<u8>)],
) -> Vec<(PyBytes, PyBytes)> {
warnings
.iter()
.map(|(path, syn)| (PyBytes::new(py, path), PyBytes::new(py, syn)))
.collect()
}
Raphaël Gomès
rust-filepatterns: add `rust-cpython` bindings for `filepatterns`...
r42515 fn build_single_regex_wrapper(
py: Python,
Raphaël Gomès
rust-filepatterns: use bytes instead of String...
r42630 kind: PyObject,
pat: PyObject,
globsuffix: PyObject,
) -> PyResult<PyBytes> {
Raphaël Gomès
rust-filepatterns: add `rust-cpython` bindings for `filepatterns`...
r42515 match build_single_regex(
Raphaël Gomès
rust-filepatterns: use bytes instead of String...
r42630 kind.extract::<PyBytes>(py)?.data(py),
pat.extract::<PyBytes>(py)?.data(py),
globsuffix.extract::<PyBytes>(py)?.data(py),
Raphaël Gomès
rust-filepatterns: add `rust-cpython` bindings for `filepatterns`...
r42515 ) {
Raphaël Gomès
rust-filepatterns: use bytes instead of String...
r42630 Ok(regex) => Ok(PyBytes::new(py, &regex)),
Raphaël Gomès
rust-filepatterns: add `rust-cpython` bindings for `filepatterns`...
r42515 Err(e) => Err(PatternError::pynew(py, e)),
}
}
pub fn init_module(py: Python, package: &str) -> PyResult<PyModule> {
let dotted_name = &format!("{}.filepatterns", package);
let m = PyModule::new(py, dotted_name)?;
m.add(py, "__package__", package)?;
m.add(
py,
"__doc__",
"Patterns files parsing - Rust implementation",
)?;
m.add(
py,
"build_single_regex",
py_fn!(
py,
build_single_regex_wrapper(
Raphaël Gomès
rust-filepatterns: use bytes instead of String...
r42630 kind: PyObject,
pat: PyObject,
globsuffix: PyObject
Raphaël Gomès
rust-filepatterns: add `rust-cpython` bindings for `filepatterns`...
r42515 )
),
)?;
m.add(
py,
"read_pattern_file",
py_fn!(
py,
read_pattern_file_wrapper(
Raphaël Gomès
rust-filepatterns: use bytes instead of String...
r42630 file_path: PyObject,
Raphaël Gomès
rust-filepatterns: add `rust-cpython` bindings for `filepatterns`...
r42515 warn: bool,
source_info: bool
)
),
)?;
Raphaël Gomès
rust-filepatterns: use bytes instead of String...
r42630 m.add(py, "PatternError", py.get_type::<PatternError>())?;
Raphaël Gomès
rust-filepatterns: add `rust-cpython` bindings for `filepatterns`...
r42515 let sys = PyModule::import(py, "sys")?;
let sys_modules: PyDict = sys.get(py, "modules")?.extract(py)?;
sys_modules.set_item(py, dotted_name, &m)?;
Ok(m)
}