Mercurial > public > mercurial-scm > hg-stable
view rust/hg-cpython/src/lib.rs @ 40978:5532823e8c18
rust-cpython: start cpython crate bindings
This changeset introduces the hg-cpython crate,
that compiles as a shared library holding a whole
Python package (mercurial.rustext), with only the empty
'ancestor' submodule for now.
Such bindings will be easier and safer to develop and maintain
that those of `hg-direct-ffi`.
They don't involve C code, only unsafe Rust that's mostly isolated
within the cpython crate.
The long-term goal would be to import the provided modules, such
as rustext.ancestor with mercurial.policy.importmod, same as
we already do with cext modules.
Differential Revision: https://phab.mercurial-scm.org/D5434
author | Georges Racinet <gracinet@anybox.fr> |
---|---|
date | Mon, 03 Dec 2018 06:52:17 +0100 |
parents | |
children | 4c25038c112c |
line wrap: on
line source
// lib.rs // // Copyright 2018 Georges Racinet <gracinet@anybox.fr> // // This software may be used and distributed according to the terms of the // GNU General Public License version 2 or any later version. //! Python bindings of `hg-core` objects using the `cpython` crate. //! Once compiled, the resulting single shared library object can be placed in //! the `mercurial` package directly as `rustext.so` or `rustext.dll`. //! It holds several modules, so that from the point of view of Python, //! it behaves as the `cext` package. //! //! Example: //! ``` //! >>> from mercurial.rustext import ancestor //! >>> ancestor.__doc__ //! 'Generic DAG ancestor algorithms - Rust implementation' //! ``` #[macro_use] extern crate cpython; extern crate hg; mod ancestors; mod exceptions; py_module_initializer!(rustext, initrustext, PyInit_rustext, |py, m| { m.add( py, "__doc__", "Mercurial core concepts - Rust implementation", )?; let dotted_name: String = m.get(py, "__name__")?.extract(py)?; m.add(py, "__package__", "mercurial")?; m.add(py, "ancestor", ancestors::init_module(py, &dotted_name)?)?; m.add(py, "GraphError", py.get_type::<exceptions::GraphError>())?; Ok(()) });