summaryrefslogtreecommitdiff
path: root/rust/kernel/alloc/kvec/errors.rs
blob: 06fe696e8bc6612a5e6aa2f6c28b685033acfa2f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// SPDX-License-Identifier: GPL-2.0

//! Errors for the [`Vec`] type.

use core::fmt::{self, Debug, Formatter};
use kernel::prelude::*;

/// Error type for [`Vec::push_within_capacity`].
pub struct PushError<T>(pub T);

impl<T> Debug for PushError<T> {
    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
        write!(f, "Not enough capacity")
    }
}

impl<T> From<PushError<T>> for Error {
    fn from(_: PushError<T>) -> Error {
        // Returning ENOMEM isn't appropriate because the system is not out of memory. The vector
        // is just full and we are refusing to resize it.
        EINVAL
    }
}

/// Error type for [`Vec::remove`].
pub struct RemoveError;

impl Debug for RemoveError {
    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
        write!(f, "Index out of bounds")
    }
}

impl From<RemoveError> for Error {
    fn from(_: RemoveError) -> Error {
        EINVAL
    }
}