use std::path::PathBuf;
pub struct FileMetadataBuilder {
mime: Option<String>,
size: u64,
modified: std::time::SystemTime,
etag: Option<String>,
}
impl FileMetadataBuilder {
pub fn mime(mut self, mime: Option<String>) -> Self {
self.mime = mime;
self
}
pub fn size(mut self, size: u64) -> Self {
self.size = size;
self
}
pub fn modified(mut self, modified: std::time::SystemTime) -> Self {
self.modified = modified;
self
}
pub fn etag(mut self, etag: Option<String>) -> Self {
self.etag = etag;
self
}
pub fn build(self) -> FileMetadata {
FileMetadata { mime: self.mime, size: self.size, modified: self.modified, etag: self.etag }
}
}
#[derive(Clone)]
pub struct FileMetadata {
mime: Option<String>,
size: u64,
modified: std::time::SystemTime,
etag: Option<String>,
}
impl FileMetadata {
pub fn builder() -> FileMetadataBuilder {
FileMetadataBuilder {
mime: None,
size: 0,
modified: std::time::SystemTime::now(),
etag: None,
}
}
pub fn mime(&self) -> Option<&String> {
self.mime.as_ref()
}
pub fn size(&self) -> u64 {
self.size
}
pub fn modified(&self) -> std::time::SystemTime {
self.modified
}
pub fn etag(&self) -> Option<&String> {
self.etag.as_ref()
}
}
pub trait File {
fn metadata(&self) -> &FileMetadata;
fn data(&self) -> Option<&Vec<u8>>;
fn path(&self) -> Option<&PathBuf>;
}
#[derive(Clone)]
pub enum FileSource {
Data {
data: Vec<u8>,
metadata: FileMetadata,
},
Path {
path: PathBuf,
metadata: FileMetadata,
},
}
impl File for FileSource {
fn metadata(&self) -> &FileMetadata {
match self {
FileSource::Data { metadata, .. } => metadata,
FileSource::Path { metadata, .. } => metadata,
}
}
fn data(&self) -> Option<&Vec<u8>> {
match self {
FileSource::Data { data, .. } => Some(data),
FileSource::Path { .. } => None,
}
}
fn path(&self) -> Option<&PathBuf> {
match self {
FileSource::Data { .. } => None,
FileSource::Path { path, .. } => Some(path),
}
}
}