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
/* Allows for coercion of rusqlite::Error into UserError */

// Third Party Dependencies
use scrawl::error::ScrawlError as ScrawlError;

// Intra Library Imports
use super::UserError;

/// Convert a ScrawlError into a UserError
///
/// # Example
/// ```should_panic
/// use scrawl;
/// use user_error::UserError;
/// use std::path::Path;
///
/// fn bad_scrawl() -> Result<String, UserError> {
///     let file = Path::new("does_not_exist.txt");
///     let output = scrawl::open(file)?;
///     Ok(output)
/// }
///
/// match bad_scrawl() {
///     Ok(s)  => println!("{}", s),
///     Err(e) => e.print_and_exit()
/// }
/// 
/// ```
impl From<ScrawlError> for UserError {
    fn from(error: ScrawlError) -> Self {
        const SUMMARY: &str = "Scrawl Error";
        match error {
            ScrawlError::EditorNotFound => UserError::hardcoded(SUMMARY,
                    &["Could not determine the user's preferred editor"],
                    &["Make sure your $EDITOR environment variable is set."]),

            ScrawlError::FailedToCreateTempfile => UserError::hardcoded(SUMMARY,
                    &["Could not create a temporary file to use as a buffer"],
                    &[]),

            ScrawlError::FailedToOpenEditor(editor) => UserError::hardcoded(SUMMARY,
                    &[&format!("Could not open {} as a text editor", editor)],
                    &[]),

            ScrawlError::FailedToReadIntoString => UserError::hardcoded(SUMMARY,
                    &["Failed to parse file into valid UTF-8 String."],
                    &[]),

            ScrawlError::FailedToCopyToTempFile(filename) => UserError::hardcoded(SUMMARY,
                &[&format!("Failed to copy the contents of the `{}` to the temporary buffer for editing.", filename)],
                &["Make sure the file exists."]),


            ScrawlError::Other(string) => UserError::simple(&string)
        }
    }
}