aboutsummaryrefslogtreecommitdiff
path: root/stockton-skeleton/src/error.rs
blob: d9d0cebed90856a7fa51300bec69e886be8b9dfc (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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
//! Error types

use thiserror::Error;

/// An error caused by a lock being poisoned.
/// This indicates an issue somewhere else, in another thread.
#[derive(Error, Debug)]
pub enum LockPoisoned {
    #[error("Device lock poisoned")]
    Device,

    #[error("Map lock poisoned")]
    Map,

    #[error("Queue lock poisoned")]
    Queue,

    #[error("Other lock poisoned")]
    Other,

    #[error("Memory pool lock poisoned")]
    MemoryPool,
}

/// Indicates the given property has no acceptable values
#[derive(Debug, Error)]
pub enum EnvironmentError {
    #[error("No supported color format")]
    ColorFormat,

    #[error("No supported depth format")]
    DepthFormat,

    #[error("No supported present mode")]
    PresentMode,

    #[error("No supported composite alpha mode")]
    CompositeAlphaMode,

    #[error("No suitable queue families found")]
    NoSuitableFamilies,

    #[error("No suitable memory types found")]
    NoMemoryTypes,

    #[error("Couldn't use shaderc")]
    NoShaderC,

    #[error("No suitable queues")]
    NoQueues,

    #[error("Memory pool missing")]
    MemoryPoolMissing,
}

/// Indicates invalid usage of an API.
#[derive(Debug, Error)]
pub enum UsageError {
    #[error("Attempt to create mappable memory block from non-mappable memory")]
    NonMappableMemory,

    #[error("Called get_queue without properly requesting the queue beforehand.")]
    QueueNegotiatorMisuse,
}

/// Displays an error with full backtrace
pub fn full_error_display(err: anyhow::Error) -> String {
    let cont = err
        .chain()
        .skip(1)
        .map(|cause| format!("    caused by: {}", cause))
        .collect::<Vec<String>>()
        .join("\n");

    format!("Error: {}\n{}", err, cont)
}