rust/hg-pyo3/src/exceptions.rs
author Georges Racinet <georges.racinet@cloudcrane.io>
Wed, 05 Feb 2025 11:04:19 +0100
changeset 52863 ab6198160960
parent 52859 9f083ff3c96c
child 52864 d961e09d3d8c
permissions -rw-r--r--
rust-pyo3-exceptions: helper for ValueError by calling to_string This may seem trivial, but it allows to use `map_err(to_string_value_error)` in many places, instead of defining a closure `map_err(|e| PyValueError::new_err(e.to_string())`, and it is much better for readability.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
52853
c6707e112d96 rust-pyo3-dirstate: exceptions for dirstate errors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52850
diff changeset
     1
use pyo3::exceptions::{PyOSError, PyRuntimeError, PyValueError};
52412
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
     2
use pyo3::import_exception;
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
     3
use pyo3::{create_exception, PyErr};
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
     4
52863
ab6198160960 rust-pyo3-exceptions: helper for ValueError by calling to_string
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52859
diff changeset
     5
use std::fmt::Display;
ab6198160960 rust-pyo3-exceptions: helper for ValueError by calling to_string
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52859
diff changeset
     6
52853
c6707e112d96 rust-pyo3-dirstate: exceptions for dirstate errors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52850
diff changeset
     7
use hg::dirstate::{on_disk::DirstateV2ParseError, DirstateError};
c6707e112d96 rust-pyo3-dirstate: exceptions for dirstate errors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52850
diff changeset
     8
52781
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
     9
use hg::revlog::nodemap::NodeMapError;
52790
1b9907575768 rust-pyo3-revlog: helpers for revision checks
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
    10
use hg::UncheckedRevision;
52781
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
    11
52412
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    12
use crate::revision::PyRevision;
52408
20c0472b2ab7 rust-pyo3: defining GraphError
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    13
20c0472b2ab7 rust-pyo3: defining GraphError
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    14
create_exception!(pyo3_rustext, GraphError, PyValueError);
52850
ffda57aa98fa rust-pyo3-dirstate: defining FallbackError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
    15
create_exception!(pyo3_rustext, FallbackError, PyRuntimeError);
52412
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    16
import_exception!(mercurial.error, WdirUnsupported);
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    17
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    18
impl GraphError {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    19
    pub fn from_hg(inner: hg::GraphError) -> PyErr {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    20
        match inner {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    21
            hg::GraphError::ParentOutOfRange(r) => {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    22
                GraphError::new_err(("ParentOutOfRange", PyRevision(r.0)))
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    23
            }
52771
2fb13c3f4496 rust: add GraphError::ParentOutOfOrder
Mitchell Kember <mkember@janestreet.com>
parents: 52531
diff changeset
    24
            hg::GraphError::ParentOutOfOrder(r) => {
2fb13c3f4496 rust: add GraphError::ParentOutOfOrder
Mitchell Kember <mkember@janestreet.com>
parents: 52531
diff changeset
    25
                GraphError::new_err(("ParentOutOfOrder", PyRevision(r.0)))
2fb13c3f4496 rust: add GraphError::ParentOutOfOrder
Mitchell Kember <mkember@janestreet.com>
parents: 52531
diff changeset
    26
            }
52412
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    27
        }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    28
    }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    29
    pub fn from_vcsgraph(inner: vcsgraph::graph::GraphReadError) -> PyErr {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    30
        match inner {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    31
            vcsgraph::graph::GraphReadError::InconsistentGraphData => {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    32
                GraphError::new_err("InconsistentGraphData")
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    33
            }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    34
            vcsgraph::graph::GraphReadError::InvalidKey => {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    35
                GraphError::new_err("ParentOutOfRange")
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    36
            }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    37
            vcsgraph::graph::GraphReadError::KeyedInvalidKey(r) => {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    38
                GraphError::new_err(("ParentOutOfRange", r))
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    39
            }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    40
            vcsgraph::graph::GraphReadError::WorkingDirectoryUnsupported => {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    41
                WdirUnsupported::new_err(())
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    42
            }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    43
        }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    44
    }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    45
}
52531
4c9e31984b3a rust-pyo3: exposition of AncestorsIterator
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52412
diff changeset
    46
4c9e31984b3a rust-pyo3: exposition of AncestorsIterator
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52412
diff changeset
    47
pub fn map_lock_error<T>(e: std::sync::PoisonError<T>) -> PyErr {
4c9e31984b3a rust-pyo3: exposition of AncestorsIterator
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52412
diff changeset
    48
    PyRuntimeError::new_err(format!("In Rust PyO3 bindings: {e}"))
4c9e31984b3a rust-pyo3: exposition of AncestorsIterator
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52412
diff changeset
    49
}
52777
32008b1e7104 rust-pyo3-revlog: Python RevlogError with helper
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52771
diff changeset
    50
52784
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
    51
pub fn map_try_lock_error<T>(e: std::sync::TryLockError<T>) -> PyErr {
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
    52
    PyRuntimeError::new_err(format!("In Rust PyO3 bindings: {e}"))
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
    53
}
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
    54
52863
ab6198160960 rust-pyo3-exceptions: helper for ValueError by calling to_string
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52859
diff changeset
    55
#[allow(unused)]
ab6198160960 rust-pyo3-exceptions: helper for ValueError by calling to_string
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52859
diff changeset
    56
pub fn to_string_value_error<T: Display>(e: T) -> PyErr {
ab6198160960 rust-pyo3-exceptions: helper for ValueError by calling to_string
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52859
diff changeset
    57
    PyValueError::new_err(e.to_string())
ab6198160960 rust-pyo3-exceptions: helper for ValueError by calling to_string
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52859
diff changeset
    58
}
ab6198160960 rust-pyo3-exceptions: helper for ValueError by calling to_string
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52859
diff changeset
    59
52777
32008b1e7104 rust-pyo3-revlog: Python RevlogError with helper
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52771
diff changeset
    60
pub mod mercurial_py_errors {
32008b1e7104 rust-pyo3-revlog: Python RevlogError with helper
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52771
diff changeset
    61
    pyo3::import_exception!(mercurial.error, RevlogError);
32008b1e7104 rust-pyo3-revlog: Python RevlogError with helper
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52771
diff changeset
    62
}
32008b1e7104 rust-pyo3-revlog: Python RevlogError with helper
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52771
diff changeset
    63
32008b1e7104 rust-pyo3-revlog: Python RevlogError with helper
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52771
diff changeset
    64
pub fn revlog_error_from_msg(e: impl ToString) -> PyErr {
32008b1e7104 rust-pyo3-revlog: Python RevlogError with helper
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52771
diff changeset
    65
    mercurial_py_errors::RevlogError::new_err(e.to_string().into_bytes())
32008b1e7104 rust-pyo3-revlog: Python RevlogError with helper
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52771
diff changeset
    66
}
52781
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
    67
52786
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
    68
pub fn revlog_error_bare() -> PyErr {
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
    69
    mercurial_py_errors::RevlogError::new_err((None::<String>,))
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
    70
}
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
    71
52790
1b9907575768 rust-pyo3-revlog: helpers for revision checks
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
    72
pub fn rev_not_in_index(rev: UncheckedRevision) -> PyErr {
1b9907575768 rust-pyo3-revlog: helpers for revision checks
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
    73
    PyValueError::new_err(format!("revlog index out of range: {}", rev))
1b9907575768 rust-pyo3-revlog: helpers for revision checks
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
    74
}
1b9907575768 rust-pyo3-revlog: helpers for revision checks
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
    75
52781
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
    76
pub fn nodemap_error(err: NodeMapError) -> PyErr {
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
    77
    match err {
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
    78
        NodeMapError::MultipleResults => {
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
    79
            mercurial_py_errors::RevlogError::new_err("")
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
    80
        }
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
    81
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
    82
        NodeMapError::RevisionNotInIndex(rev) => {
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
    83
            PyValueError::new_err(format!(
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
    84
                "Inconsistency: Revision {} found in nodemap \
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
    85
             is not in revlog index",
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
    86
                rev
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
    87
            ))
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
    88
        }
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
    89
    }
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
    90
}
52795
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    91
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    92
pub fn graph_error(_err: hg::GraphError) -> PyErr {
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    93
    // ParentOutOfRange is currently the only alternative
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    94
    // in `hg::GraphError`. The C index always raises this simple ValueError.
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    95
    PyValueError::new_err("parent out of range")
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    96
}
52853
c6707e112d96 rust-pyo3-dirstate: exceptions for dirstate errors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52850
diff changeset
    97
c6707e112d96 rust-pyo3-dirstate: exceptions for dirstate errors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52850
diff changeset
    98
pub fn dirstate_error(err: DirstateError) -> PyErr {
c6707e112d96 rust-pyo3-dirstate: exceptions for dirstate errors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52850
diff changeset
    99
    PyOSError::new_err(format!("Dirstate error: {:?}", err))
c6707e112d96 rust-pyo3-dirstate: exceptions for dirstate errors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52850
diff changeset
   100
}
c6707e112d96 rust-pyo3-dirstate: exceptions for dirstate errors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52850
diff changeset
   101
c6707e112d96 rust-pyo3-dirstate: exceptions for dirstate errors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52850
diff changeset
   102
pub fn dirstate_v2_error(_err: DirstateV2ParseError) -> PyErr {
c6707e112d96 rust-pyo3-dirstate: exceptions for dirstate errors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52850
diff changeset
   103
    PyValueError::new_err("corrupted dirstate-v2")
c6707e112d96 rust-pyo3-dirstate: exceptions for dirstate errors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52850
diff changeset
   104
}