jsonhash 0.2.0

A command-line tool to generate hash values for files. SHA256 and MD5. Output and Error messages in JSON format.
Documentation
use serde::{Deserialize, Serialize};
use std::fmt;

/// Error codes as specified in the README
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ErrorMessage {
    pub code: i32,
    pub message: String,
}

impl ErrorMessage {
    pub fn new(code: i32, message: &str) -> Self {
        Self {
            code,
            message: message.to_string(),
        }
    }
    
    pub fn to_json(&self) -> String {
        serde_json::to_string(self).unwrap_or_else(|_| "{}".to_string())
    }
}

/// Standardized error codes from README
#[derive(Debug, Clone)]
pub enum JsonHashError {
    HashAlgorithmInvalid,
    NotAFile,
    FileDoesNotExist,
    FileOpeningError,
    HashDigestComputationError,
}

impl JsonHashError {
    pub fn code(&self) -> i32 {
        match self {
            JsonHashError::HashAlgorithmInvalid => 3,
            JsonHashError::NotAFile => 5,
            JsonHashError::FileDoesNotExist => 6,
            JsonHashError::FileOpeningError => 66,
            JsonHashError::HashDigestComputationError => 70,
        }
    }
    
    pub fn message(&self) -> &'static str {
        match self {
            JsonHashError::HashAlgorithmInvalid => "HASH-ALGORITHM-INVALID",
            JsonHashError::NotAFile => "NOT-A-FILE",
            JsonHashError::FileDoesNotExist => "FILE-DOES-NOT-EXIST",
            JsonHashError::FileOpeningError => "FILE-OPENING-ERROR",
            JsonHashError::HashDigestComputationError => "HASH-DIGEST-COMPUTATION-ERROR",
        }
    }
}

impl fmt::Display for JsonHashError {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "{}", self.message())
    }
}

impl From<JsonHashError> for ErrorMessage {
    fn from(error: JsonHashError) -> Self {
        ErrorMessage::new(error.code(), error.message())
    }
}