assemble_core/task/work_handler/
output.rs

1use 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/// The output of a task.
14#[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    /// Create a new output from a file collection
23    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    /// Gets previously serialized data, if any set
37    pub fn serialized_data(&self) -> Option<&HashMap<String, Serializable>> {
38        self.serialized_data.as_ref()
39    }
40}
41
42impl UpToDate for Output {
43    /// The output of a task it not up to date if any files have been removed or added, or if a file is newer
44    /// than the time stamp
45    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}