assemble_core/task/work_handler/
output.rs1use crate::file_collection::{FileCollection, FileSet};
2
3use crate::task::up_to_date::UpToDate;
4use crate::task::work_handler::serializer::Serializable;
5
6use serde::Deserialize;
7
8use std::collections::{HashMap, HashSet};
9
10use std::path::PathBuf;
11use std::time::SystemTime;
12
13#[derive(Debug, Serialize, Deserialize, Clone)]
15pub struct Output {
16 timestamp: SystemTime,
17 files: HashSet<PathBuf>,
18 serialized_data: Option<HashMap<String, Serializable>>,
19}
20
21impl Output {
22 pub fn new<F: FileCollection>(
24 fc: F,
25 serialized_data: impl Into<Option<HashMap<String, Serializable>>>,
26 ) -> Self {
27 let files = fc.files();
28 let timestamp = SystemTime::now();
29 Self {
30 timestamp,
31 files,
32 serialized_data: serialized_data.into(),
33 }
34 }
35
36 pub fn serialized_data(&self) -> Option<&HashMap<String, Serializable>> {
38 self.serialized_data.as_ref()
39 }
40}
41
42impl UpToDate for Output {
43 fn up_to_date(&self) -> bool {
46 (|| -> Result<(), ()> {
47 let regenerated_files = FileSet::from_iter(&self.files).files();
48 if regenerated_files == self.files {
49 for file in regenerated_files {
50 let meta_data = file.metadata().map_err(|_| ())?;
51 if meta_data.modified().map_err(|_| ())? > self.timestamp {
52 return Err(());
53 }
54 }
55 Ok(())
56 } else {
57 Err(())
58 }
59 })()
60 .is_ok()
61 }
62}