Skip to main content

medullah_multipart/
result.rs

1use crate::file_validator::{ErrorMessage, InputError};
2use crate::FileInput;
3use std::fmt::{Display, Formatter};
4use std::io::Error;
5
6pub type MultipartResult<T> = Result<T, MultipartError>;
7
8#[derive(Debug)]
9pub enum MultipartError {
10    NoFile,
11    IoError(Error),
12    NoContentType(String),
13    MissingDataField(String),
14    InvalidContentDisposition(String),
15    NtexError(ntex_multipart::MultipartError),
16    ValidationError(InputError),
17}
18
19impl From<Error> for MultipartError {
20    fn from(value: Error) -> Self {
21        MultipartError::IoError(value)
22    }
23}
24
25impl Display for MultipartError {
26    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
27        match self {
28            MultipartError::IoError(err) => {
29                write!(f, "{}", err)
30            }
31            MultipartError::NoFile => {
32                write!(f, "No file was uploaded")
33            }
34            MultipartError::MissingDataField(ct) => {
35                write!(f, "Data field '{}' is required", ct)
36            }
37            MultipartError::NoContentType(ct) => {
38                write!(f, "Invalid content type: {}", ct)
39            }
40            MultipartError::InvalidContentDisposition(err) => {
41                write!(f, "Invalid content disposition: {}", err)
42            }
43            MultipartError::NtexError(err) => {
44                write!(f, "{}", err)
45            }
46            MultipartError::ValidationError(err) => {
47                let field_name = err.name.clone().replace("_", " ");
48                match err.error.clone() {
49                    ErrorMessage::NoFiles => {
50                        write!(f, "No files were uploaded for field: '{field_name}'")
51                    }
52                    ErrorMessage::FileTooSmall(size) => {
53                        write!(
54                            f,
55                            "File size is too small for field '{field_name}'. Minimum size is {}",
56                            FileInput::format_size(size)
57                        )
58                    }
59                    ErrorMessage::FileTooLarge(size) => {
60                        write!(
61                            f,
62                            "File size is too big for field '{field_name}'. Maximum size is {}",
63                            FileInput::format_size(size)
64                        )
65                    }
66                    ErrorMessage::TooFewFiles(count) => {
67                        write!(
68                            f,
69                            "Too few files uploaded for field '{field_name}'. Minimum is {}",
70                            count
71                        )
72                    }
73                    ErrorMessage::TooManyFiles(count) => {
74                        write!(
75                            f,
76                            "Too many files uploaded for field '{field_name}'. Maximum is {}",
77                            count
78                        )
79                    }
80                    ErrorMessage::InvalidFileExtension(ext) => {
81                        write!(
82                            f,
83                            "Invalid file extension for field '{field_name}': .{}",
84                            ext.clone().unwrap_or_default()
85                        )
86                    }
87                    ErrorMessage::InvalidContentType(mime) => {
88                        write!(f, "Invalid mime type: {}", mime)
89                    }
90                    ErrorMessage::MissingFileExtension(mime) => {
91                        write!(f, "Invalid file, file extension is required: {}", mime)
92                    }
93                }
94            }
95        }
96    }
97}