1use std::fmt::Display;
24
25use ferrix_lib::{
26 battery::BatInfo,
27 cpu::Processors,
28 drm::Video,
29 init::SystemdServices,
30 ram::RAM,
31 sys::{Groups, KModules, Kernel, OsRelease, Users},
32 traits::ToJson,
33};
34use serde::Serialize;
35
36use crate::DataLoadingState;
37
38#[derive(Debug, Clone, Eq, PartialEq)]
39pub enum ExportStatus {
40 LoadingData,
41 ErrorLoadingData(String),
42 SerializingStructure,
43 ErrorSerializing(String),
44 WritingData,
45 ErrorWritingData(String),
46}
47
48#[derive(Debug, Clone, Eq, PartialEq)]
49pub enum ExportFormat {
50 CompressedJson,
51 HumanJson,
52}
53
54impl ExportFormat {
55 pub const ALL: &[Self] = &[Self::CompressedJson, Self::HumanJson];
56}
57
58impl Display for ExportFormat {
59 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
60 write!(
61 f,
62 "{}",
63 match self {
64 Self::CompressedJson => "Compressed JSON",
65 Self::HumanJson => "Human-readable JSON",
66 }
67 )
68 }
69}
70
71#[derive(Debug, Clone, Eq, PartialEq)]
72pub enum ExportMode {
73 AllData,
74 Selected,
75}
76
77impl ExportMode {
78 pub const ALL: &[Self] = &[Self::AllData, Self::Selected];
79}
80
81impl Display for ExportMode {
82 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
83 write!(
84 f,
85 "{}",
86 match self {
87 Self::AllData => "All collected data",
88 Self::Selected => "Selected data",
89 }
90 )
91 }
92}
93
94#[derive(Debug, Clone, Serialize)]
95#[serde(untagged)]
96pub enum ExportMember<'a, T> {
97 Data { data: Option<&'a T> },
98 Error { error_text: String },
99}
100
101impl<'a, T> From<&'a DataLoadingState<T>> for ExportMember<'a, T> {
102 fn from(value: &'a DataLoadingState<T>) -> Self {
103 match value {
104 DataLoadingState::Loaded(data) => Self::Data { data: Some(data) },
105 DataLoadingState::Loading => Self::Data { data: None },
106 DataLoadingState::Error(why) => Self::Error {
107 error_text: why.clone(),
108 },
109 }
110 }
111}
112
113fn get_data<'a, T>(data: &'a DataLoadingState<T>) -> Option<ExportMember<'a, T>> {
114 if let DataLoadingState::Loading = data {
115 return None;
116 }
117 Some(ExportMember::from(data))
118}
119
120#[derive(Debug, Clone, Serialize)]
121pub struct ExportData<'a> {
122 pub cpu: Option<ExportMember<'a, Processors>>,
123 pub ram: Option<ExportMember<'a, RAM>>,
124 pub battery: Option<ExportMember<'a, BatInfo>>,
125 pub drm: Option<ExportMember<'a, Video>>,
126 pub os_release: Option<ExportMember<'a, OsRelease>>,
127 pub kernel: Option<ExportMember<'a, Kernel>>,
128 pub kmods: Option<ExportMember<'a, KModules>>,
129 pub users: Option<ExportMember<'a, Users>>,
130 pub groups: Option<ExportMember<'a, Groups>>,
131 pub systemd: Option<ExportMember<'a, SystemdServices>>,
132 pub misc: Option<ExportMember<'a, crate::System>>,
133}
134
135impl<'a> From<&'a mut crate::ferrix::Ferrix> for ExportData<'a> {
136 fn from(value: &'a mut crate::ferrix::Ferrix) -> Self {
137 Self {
138 cpu: get_data(&value.data.proc_data),
139 ram: get_data(&value.data.ram_data),
140 battery: get_data(&value.data.bat_data),
141 drm: get_data(&value.data.drm_data),
142 os_release: get_data(&value.data.osrel_data),
143 kernel: get_data(&value.data.kernel_data),
144 kmods: get_data(&value.data.kmods_data),
145 users: get_data(&value.data.users_list),
146 groups: get_data(&value.data.groups_list),
147 systemd: get_data(&value.data.sysd_services_list),
148 misc: get_data(&value.data.system),
149 }
150 }
151}
152
153impl<'a> ToJson for ExportData<'a> {}