monorepo/file-service/src/store/fileinfo.rs

70 lines
1.8 KiB
Rust
Raw Normal View History

2023-09-23 23:15:56 +00:00
use crate::FileId;
2023-09-23 19:17:49 +00:00
use super::{ReadFileError, WriteFileError};
use chrono::prelude::*;
use serde::{Deserialize, Serialize};
2023-09-23 19:17:49 +00:00
use std::{
io::{Read, Write},
path::PathBuf,
};
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct FileInfo {
2023-09-23 23:15:56 +00:00
pub id: FileId,
pub size: usize,
pub created: DateTime<Utc>,
pub file_type: String,
pub hash: String,
2023-09-23 23:15:56 +00:00
pub extension: String,
}
impl FileInfo {
pub fn load(path: PathBuf) -> Result<Self, ReadFileError> {
let mut content: Vec<u8> = Vec::new();
2023-09-23 23:15:56 +00:00
let mut file =
std::fs::File::open(path.clone()).map_err(|_| ReadFileError::FileNotFound(path))?;
file.read_to_end(&mut content)?;
let js = serde_json::from_slice(&content)?;
Ok(js)
}
pub fn save(&self, path: PathBuf) -> Result<(), WriteFileError> {
let ser = serde_json::to_string(self).unwrap();
let mut file = std::fs::File::create(path)?;
2023-10-04 19:57:18 +00:00
let _ = file.write(ser.as_bytes())?;
Ok(())
}
}
#[cfg(test)]
mod test {
use super::*;
2023-09-25 04:58:35 +00:00
use crate::store::FileId;
use tempdir::TempDir;
#[test]
fn it_saves_and_loads_metadata() {
2023-09-25 04:58:35 +00:00
let tmp = TempDir::new("var").unwrap();
let created = Utc::now();
let info = FileInfo {
2023-09-23 23:15:56 +00:00
id: FileId("temp-id".to_owned()),
size: 23777,
created,
file_type: "image/png".to_owned(),
hash: "abcdefg".to_owned(),
2023-09-23 23:15:56 +00:00
extension: "png".to_owned(),
};
2023-09-25 04:58:35 +00:00
let mut path = tmp.path().to_owned();
path.push(&PathBuf::from(info.id.clone()));
info.save(path.clone()).unwrap();
2023-09-25 04:58:35 +00:00
let info_ = FileInfo::load(path).unwrap();
assert_eq!(info_.size, 23777);
assert_eq!(info_.created, info.created);
assert_eq!(info_.file_type, "image/png");
assert_eq!(info_.hash, info.hash);
}
}