Skip to main content

roblox_studio_utils/
result.rs

1use std::{error::Error, fmt, io, path::PathBuf};
2
3/**
4    An error that may occur when interacting with Roblox Studio.
5*/
6#[derive(Debug)]
7#[non_exhaustive]
8pub enum RobloxStudioError {
9    UnknownTask(String),
10    UserDocumentsDirMissing,
11    LocalDataDirMissing,
12    LocalDataDirCopyPlace(String),
13    PathCanonicalize(String),
14    PathToString(PathBuf),
15    Io(io::Error),
16}
17
18impl fmt::Display for RobloxStudioError {
19    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
20        match self {
21            RobloxStudioError::UnknownTask(s) => write!(f, "Unknown task: {s}"),
22            RobloxStudioError::UserDocumentsDirMissing => {
23                write!(f, "Failed to find user documents directory")
24            }
25            RobloxStudioError::LocalDataDirMissing => {
26                write!(f, "Failed to find local data directory")
27            }
28            RobloxStudioError::LocalDataDirCopyPlace(s) => {
29                write!(f, "Failed to copy place file to local data directory: {s}")
30            }
31            RobloxStudioError::PathCanonicalize(s) => write!(f, "Failed to canonicalize path: {s}"),
32            RobloxStudioError::PathToString(p) => {
33                write!(f, "Failed to convert path to string: {}", p.display())
34            }
35            RobloxStudioError::Io(e) => write!(f, "I/O error: {e}"),
36        }
37    }
38}
39
40impl Error for RobloxStudioError {
41    fn source(&self) -> Option<&(dyn Error + 'static)> {
42        if let Self::Io(e) = self {
43            Some(e)
44        } else {
45            None
46        }
47    }
48}
49
50impl From<io::Error> for RobloxStudioError {
51    fn from(value: io::Error) -> Self {
52        RobloxStudioError::Io(value)
53    }
54}
55
56/**
57    Type alias for results that return a `RobloxStudioError`.
58*/
59pub type RobloxStudioResult<T> = Result<T, RobloxStudioError>;