Mercurial > public > mercurial-scm > hg
annotate rust/hg-pyo3/src/node.rs @ 52841:28f0f00b5dbd
rust-pyo3: rename the `util` file to `utils`
This is the convention in the rust code, since all other places are plural.
author | Rapha?l Gom?s <rgomes@octobus.net> |
---|---|
date | Sun, 05 Jan 2025 23:39:02 +0100 |
parents | 4e34e8fd46d4 |
children | e2d2961b8383 |
rev | line source |
---|---|
52785
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
1 use pyo3::exceptions::PyValueError; |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
2 use pyo3::prelude::*; |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
3 use pyo3::types::PyBytes; |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
4 |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
5 use hg::revlog::RevlogIndex; |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
6 use hg::{ |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
7 revlog::index::Index, revlog::node::NODE_BYTES_LENGTH, Node, NodePrefix, |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
8 Revision, |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
9 }; |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
10 |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
11 #[derive(Debug, Copy, Clone, PartialEq, derive_more::From)] |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
12 pub struct PyNode(Node); |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
13 |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
14 /// Copy incoming Python binary Node ID into [`Node`] |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
15 /// |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
16 /// # Python exceptions |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
17 /// Raises `ValueError` if length is not as expected |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
18 pub fn node_from_py_bytes(bytes: &Bound<'_, PyBytes>) -> PyResult<Node> { |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
19 Node::try_from(bytes.as_bytes()).map_err(|_| { |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
20 PyValueError::new_err(format!( |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
21 "{}-byte hash required", |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
22 NODE_BYTES_LENGTH |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
23 )) |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
24 }) |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
25 } |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
26 |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
27 /// Convert Python hexadecimal Node ID node or prefix given as `bytes` into |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
28 /// [`NodePrefix`]. |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
29 /// |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
30 /// # Python exceptions |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
31 /// Raises `ValueError` if the incoming `bytes` is invalid. |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
32 pub fn node_prefix_from_py_bytes( |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
33 bytes: &Bound<'_, PyBytes>, |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
34 ) -> PyResult<NodePrefix> { |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
35 let as_bytes = bytes.as_bytes(); |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
36 NodePrefix::from_hex(as_bytes).map_err(|_| { |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
37 PyValueError::new_err(format!( |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
38 "Invalid node or prefix '{}'", |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
39 String::from_utf8_lossy(as_bytes) |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
40 )) |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
41 }) |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
42 } |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
43 |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
44 /// Return the binary node from a checked revision |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
45 /// |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
46 /// This is meant to be used on revisions already checked to exist, |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
47 /// typically obtained from a NodeTree lookup. |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
48 /// |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
49 /// # Panics |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
50 /// Panics if the revision does not exist |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
51 pub fn py_node_for_rev<'py>( |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
52 py: Python<'py>, |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
53 idx: &Index, |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
54 rev: Revision, |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
55 ) -> Bound<'py, PyBytes> { |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
56 PyBytes::new(py, idx.node(rev).expect("node should exist").as_bytes()) |
71ebe880f24a
hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
57 } |