Skip to main content

ebi_objects/ebi_objects/
executions.rs

1use anyhow::Result;
2use chrono::{DateTime, FixedOffset};
3use serde::{Deserialize, Serialize};
4use std::{
5    fmt::{self, Display},
6    io::BufRead,
7};
8
9#[cfg(any(test, feature = "testactivities"))]
10use crate::activity_key::has_activity_key::TestActivityKey;
11use crate::{
12    Exportable, Importable, Infoable,
13    constants::ebi_object::EbiObject,
14    traits::importable::{ImporterParameter, ImporterParameterValues, from_string},
15};
16
17pub const HEADER: &str = "executions";
18
19pub const FORMAT_SPECIFICATION: &str = "not yet finalised.";
20
21#[derive(Serialize, Deserialize, Clone)]
22pub struct Executions {
23    executions: Vec<Execution>,
24}
25
26impl Importable for Executions {
27    const FILE_FORMAT_SPECIFICATION_LATEX: &str = "A JSON-formatted list of executions.
28    
29    For instance:
30    \\lstinputlisting[language=ebilines, style=boxed]{../testfiles/a-b.exs}";
31
32    const IMPORTER_PARAMETERS: &[ImporterParameter] = &[];
33
34    fn import_as_object(
35        reader: &mut dyn BufRead,
36        parameter_values: &ImporterParameterValues,
37    ) -> Result<EbiObject> {
38        Ok(EbiObject::Executions(Self::import(
39            reader,
40            parameter_values,
41        )?))
42    }
43
44    fn import(reader: &mut dyn BufRead, _: &ImporterParameterValues) -> Result<Self>
45    where
46        Self: Sized,
47    {
48        Ok(serde_json::from_reader(reader)?)
49    }
50}
51from_string!(Executions);
52
53impl Infoable for Executions {
54    fn info(&self, f: &mut impl std::io::Write) -> Result<()> {
55        writeln!(f, "Number of executions\t\t{}", self.executions.len())?;
56
57        Ok(writeln!(f, "")?)
58    }
59}
60
61impl Display for Executions {
62    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
63        let x = serde_json::to_string(self).unwrap();
64        write!(f, "{}", x)
65    }
66}
67
68impl Exportable for Executions {
69    fn export_from_object(object: EbiObject, f: &mut dyn std::io::Write) -> Result<()> {
70        match object {
71            EbiObject::Executions(exe) => exe.export(f),
72            _ => unreachable!(),
73        }
74    }
75
76    fn export(&self, f: &mut dyn std::io::Write) -> Result<()> {
77        Ok(write!(f, "{}", self)?)
78    }
79}
80
81impl From<Vec<Execution>> for Executions {
82    fn from(value: Vec<Execution>) -> Self {
83        Self { executions: value }
84    }
85}
86
87#[derive(Serialize, Deserialize, Clone)]
88pub struct Execution {
89    pub transition: usize,
90    pub enabled_transitions_at_enablement: Option<Vec<usize>>,
91    pub time_of_enablement: Option<DateTime<FixedOffset>>,
92    pub time_of_execution: Option<DateTime<FixedOffset>>,
93    pub features_at_enablement: Option<Vec<usize>>,
94}
95
96impl Display for Execution {
97    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
98        let x = serde_json::to_string(self).unwrap();
99        write!(f, "{}", x)
100    }
101}
102
103#[cfg(any(test, feature = "testactivities"))]
104impl TestActivityKey for Executions {
105    fn test_activity_key(&self) {
106        //no activities are stored
107    }
108}