post_archiver/
file_meta.rs1use serde::{Deserialize, Serialize};
2
3use serde_json::Value;
4#[cfg(feature = "typescript")]
5use ts_rs::TS;
6
7use std::{collections::HashMap, hash::Hash, path::PathBuf};
8
9use crate::{
10 id::{FileMetaId, PostId},
11 Post,
12};
13
14pub const POSTS_PRE_CHUNK: u32 = 2048;
16
17#[cfg_attr(feature = "typescript", derive(TS))]
19#[cfg_attr(feature = "typescript", ts(export))]
20#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq)]
21pub struct FileMeta {
22 pub id: FileMetaId,
23 pub filename: String,
24 pub post: PostId,
25 pub mime: String,
26 #[cfg_attr(feature = "typescript", ts(type = "Record<string, any>"))]
27 pub extra: HashMap<String, Value>,
28}
29
30impl FileMeta {
31 pub fn path(&self) -> PathBuf {
56 let directory = Post::directory(self.post);
57 directory.join(&self.filename)
58 }
59
60 pub fn directory(&self) -> PathBuf {
61 Post::directory(self.post)
62 }
63}
64
65impl Hash for FileMeta {
66 fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
67 self.id.hash(state);
68 self.post.hash(state);
69 self.filename.hash(state);
70 self.mime.hash(state);
71 }
73}
74
75#[cfg(feature = "utils")]
76mod definitions {
77 use crate::utils::macros::as_table;
78
79 use super::*;
80
81 as_table!(
82 "file_metas" => FileMeta {
83 id: "id",
84 post: "post",
85 filename: "filename",
86 mime: "mime",
87 extra: "extra" => json,
88 }
89 );
90}