copymap.rs
122 lines
| 3.3 KiB
| application/rls-services+xml
|
RustLexer
Raphaël Gomès
|
r42999 | // copymap.rs | ||
// | ||||
// Copyright 2019 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 `hg::dirstate::dirstate_map::CopyMap` provided by the | ||||
//! `hg-core` package. | ||||
Yuya Nishihara
|
r44703 | use cpython::{ | ||
PyBytes, PyClone, PyDict, PyObject, PyResult, Python, UnsafePyLeaked, | ||||
}; | ||||
Raphaël Gomès
|
r42999 | use std::cell::RefCell; | ||
Simon Sapin
|
r48126 | use crate::dirstate::dirstate_map::v2_error; | ||
Yuya Nishihara
|
r43447 | use crate::dirstate::dirstate_map::DirstateMap; | ||
Simon Sapin
|
r48882 | use hg::dirstate::CopyMapIter; | ||
Simon Sapin
|
r48126 | use hg::dirstate_tree::on_disk::DirstateV2ParseError; | ||
Simon Sapin
|
r47894 | use hg::utils::hg_path::HgPath; | ||
Raphaël Gomès
|
r42999 | |||
py_class!(pub class CopyMap |py| { | ||||
data dirstate_map: DirstateMap; | ||||
def __getitem__(&self, key: PyObject) -> PyResult<PyBytes> { | ||||
(*self.dirstate_map(py)).copymapgetitem(py, key) | ||||
} | ||||
def __len__(&self) -> PyResult<usize> { | ||||
self.dirstate_map(py).copymaplen(py) | ||||
} | ||||
def __contains__(&self, key: PyObject) -> PyResult<bool> { | ||||
self.dirstate_map(py).copymapcontains(py, key) | ||||
} | ||||
def get( | ||||
&self, | ||||
key: PyObject, | ||||
default: Option<PyObject> = None | ||||
) -> PyResult<Option<PyObject>> { | ||||
self.dirstate_map(py).copymapget(py, key, default) | ||||
} | ||||
def pop( | ||||
&self, | ||||
key: PyObject, | ||||
default: Option<PyObject> = None | ||||
) -> PyResult<Option<PyObject>> { | ||||
self.dirstate_map(py).copymappop(py, key, default) | ||||
} | ||||
def __iter__(&self) -> PyResult<CopyMapKeysIterator> { | ||||
self.dirstate_map(py).copymapiter(py) | ||||
} | ||||
// Python's `dict()` builtin works with either a subclass of dict | ||||
// or an abstract mapping. Said mapping needs to implement `__getitem__` | ||||
// and `keys`. | ||||
def keys(&self) -> PyResult<CopyMapKeysIterator> { | ||||
self.dirstate_map(py).copymapiter(py) | ||||
} | ||||
def items(&self) -> PyResult<CopyMapItemsIterator> { | ||||
self.dirstate_map(py).copymapitemsiter(py) | ||||
} | ||||
def iteritems(&self) -> PyResult<CopyMapItemsIterator> { | ||||
self.dirstate_map(py).copymapitemsiter(py) | ||||
} | ||||
def __setitem__( | ||||
&self, | ||||
key: PyObject, | ||||
item: PyObject | ||||
) -> PyResult<()> { | ||||
self.dirstate_map(py).copymapsetitem(py, key, item)?; | ||||
Ok(()) | ||||
} | ||||
def copy(&self) -> PyResult<PyDict> { | ||||
self.dirstate_map(py).copymapcopy(py) | ||||
} | ||||
}); | ||||
impl CopyMap { | ||||
pub fn from_inner(py: Python, dm: DirstateMap) -> PyResult<Self> { | ||||
Self::create_instance(py, dm) | ||||
} | ||||
fn translate_key( | ||||
py: Python, | ||||
Simon Sapin
|
r48126 | res: Result<(&HgPath, &HgPath), DirstateV2ParseError>, | ||
Raphaël Gomès
|
r42999 | ) -> PyResult<Option<PyBytes>> { | ||
Simon Sapin
|
r48126 | let (k, _v) = res.map_err(|e| v2_error(py, e))?; | ||
Ok(Some(PyBytes::new(py, k.as_bytes()))) | ||||
Raphaël Gomès
|
r42999 | } | ||
fn translate_key_value( | ||||
py: Python, | ||||
Simon Sapin
|
r48126 | res: Result<(&HgPath, &HgPath), DirstateV2ParseError>, | ||
Raphaël Gomès
|
r42999 | ) -> PyResult<Option<(PyBytes, PyBytes)>> { | ||
Simon Sapin
|
r48126 | let (k, v) = res.map_err(|e| v2_error(py, e))?; | ||
Raphaël Gomès
|
r43227 | Ok(Some(( | ||
Raphaël Gomès
|
r45500 | PyBytes::new(py, k.as_bytes()), | ||
PyBytes::new(py, v.as_bytes()), | ||||
Raphaël Gomès
|
r43227 | ))) | ||
Raphaël Gomès
|
r42999 | } | ||
} | ||||
Yuya Nishihara
|
r43159 | py_shared_iterator!( | ||
Raphaël Gomès
|
r42999 | CopyMapKeysIterator, | ||
Yuya Nishihara
|
r44703 | UnsafePyLeaked<CopyMapIter<'static>>, | ||
Raphaël Gomès
|
r42999 | CopyMap::translate_key, | ||
Option<PyBytes> | ||||
); | ||||
Yuya Nishihara
|
r43159 | py_shared_iterator!( | ||
Raphaël Gomès
|
r42999 | CopyMapItemsIterator, | ||
Yuya Nishihara
|
r44703 | UnsafePyLeaked<CopyMapIter<'static>>, | ||
Raphaël Gomès
|
r42999 | CopyMap::translate_key_value, | ||
Option<(PyBytes, PyBytes)> | ||||
); | ||||