1use std::fmt;
5
6#[derive(Debug, Clone, PartialEq)]
12#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13pub struct Progress {
14 #[cfg_attr(feature = "serde", serde(flatten))]
16 pub report: Report,
17
18 #[cfg_attr(feature = "serde", serde(default))]
20 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Vec::is_empty"))]
21 pub children: Vec<Progress>,
22}
23
24#[derive(Default, Clone, Debug, PartialEq)]
30#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
31#[cfg_attr(feature = "serde", serde(default))]
32pub struct Report {
33 pub label: String,
35
36 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "String::is_empty"))]
38 pub desc: String,
39
40 pub state: State,
42
43 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Vec::is_empty"))]
45 pub accums: Vec<Message>,
46}
47
48#[derive(Debug, Clone, Copy, PartialEq)]
54#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
55pub enum State {
56 InProgress {
58 #[cfg_attr(feature = "serde", serde(default))]
60 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
61 len: Option<u64>,
62
63 pos: u64,
65
66 bytes: bool,
68
69 remaining: f32,
71 },
72 Completed {
78 duration: f32,
80 },
81 Cancelled,
83}
84
85impl Default for State {
86 fn default() -> Self {
87 State::InProgress {
88 len: None,
89 pos: 0,
90 bytes: false,
91 remaining: f32::INFINITY,
92 }
93 }
94}
95
96#[derive(Debug, Clone, PartialEq)]
102#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
103pub struct Message {
104 pub severity: Severity,
106 pub msg: String,
108}
109
110#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Default)]
114#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
115#[allow(missing_docs)]
116pub enum Severity {
117 Error,
118 Warn,
119 #[default]
120 Info,
121}
122
123impl fmt::Display for Severity {
124 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
125 match self {
126 Self::Error => write!(f, "ERROR"),
127 Self::Warn => write!(f, "WARN"),
128 Self::Info => write!(f, "INFO"),
129 }
130 }
131}