thot_core/
result.rs

1//! Common error types.
2use crate::db::error::Error as DbError;
3use crate::types::{ResourceId, ResourcePath};
4use std::convert::From;
5use std::ffi::OsString;
6use std::io;
7use std::path::PathBuf;
8use std::result::Result as StdResult;
9
10#[cfg(feature = "serde")]
11use serde::{self, Deserialize, Serialize};
12
13// **********************
14// *** Resource Error ***
15// **********************
16
17#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
18#[derive(Debug)]
19pub enum ResourceError {
20    DoesNotExist(String),
21    DuplicateId(ResourceId),
22    AlreadyExists(String),
23}
24
25// **********************
26// *** Project Error ***
27// **********************
28
29#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
30#[derive(Debug)]
31pub enum ProjectError {
32    NotRegistered(Option<ResourceId>, Option<PathBuf>),
33    Misconfigured(String),
34}
35
36// ***********************
37// *** Container Error ***
38// ***********************
39
40#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
41#[derive(Debug)]
42pub enum ContainerError {
43    MissingChild(ResourceId),
44}
45
46// *******************
47// *** Asset Error ***
48// *******************
49
50#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
51#[derive(Debug)]
52pub enum AssetError {
53    NotRegistered(Option<ResourceId>, Option<ResourcePath>),
54    PathNotSet,
55}
56
57// ********************
58// *** Script Error ***
59// ********************
60
61// @todo: serde features.
62#[derive(Debug)]
63pub enum ScriptError {
64    UnknownLanguage(Option<OsString>),
65}
66
67// ***************************
68// *** Resource Path Error ***
69// ***************************
70
71#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
72#[derive(Debug)]
73pub enum ResourcePathError {
74    CouldNotParseMetalevel(String),
75}
76
77// ******************
78// *** Thot Error ***
79// ******************
80
81#[derive(Debug)]
82pub enum Error {
83    AssetError(AssetError),
84    IoError(io::Error),
85    ScriptError(ScriptError),
86    ResourceError(ResourceError),
87    ProjectError(ProjectError),
88    ContainerError(ContainerError),
89    DbError(DbError),
90    ResourcePathError(ResourcePathError),
91    SerdeError(serde_json::Error),
92}
93
94impl From<io::Error> for Error {
95    fn from(err: io::Error) -> Self {
96        Error::IoError(err)
97    }
98}
99
100impl From<serde_json::Error> for Error {
101    fn from(err: serde_json::Error) -> Self {
102        Error::SerdeError(err)
103    }
104}
105
106// @todo: Make better.
107#[cfg(feature = "serde")]
108impl Serialize for Error {
109    fn serialize<S>(&self, serializer: S) -> StdResult<S::Ok, S::Error>
110    where
111        S: serde::ser::Serializer,
112    {
113        let msg = format!("{:?}", self);
114        serializer.serialize_str(msg.as_ref())
115    }
116}
117
118// *******************
119// *** Thot Result ***
120// *******************
121
122pub type Result<T = ()> = StdResult<T, Error>;
123
124impl From<Error> for Result {
125    fn from(err: Error) -> Self {
126        Err(err)
127    }
128}
129
130#[cfg(test)]
131#[path = "./result_test.rs"]
132mod result_test;