1use 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#[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#[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#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
41#[derive(Debug)]
42pub enum ContainerError {
43 MissingChild(ResourceId),
44}
45
46#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
51#[derive(Debug)]
52pub enum AssetError {
53 NotRegistered(Option<ResourceId>, Option<ResourcePath>),
54 PathNotSet,
55}
56
57#[derive(Debug)]
63pub enum ScriptError {
64 UnknownLanguage(Option<OsString>),
65}
66
67#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
72#[derive(Debug)]
73pub enum ResourcePathError {
74 CouldNotParseMetalevel(String),
75}
76
77#[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#[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
118pub 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;