leenfetch_core/
system_info.rs

1use serde::{Deserialize, Serialize};
2
3use crate::{core::Data, modules::enums::SongInfo};
4
5pub const PROTOCOL_VERSION: u32 = 1;
6
7/// Stable JSON-friendly representation of all collected system information.
8#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct SystemInfo {
10    pub protocol_version: u32,
11    pub username: Option<String>,
12    pub hostname: Option<String>,
13    pub host: Option<String>,
14    pub os: Option<String>,
15    pub distro: Option<String>,
16    pub model: Option<String>,
17    pub kernel: Option<String>,
18    pub os_age: Option<String>,
19    pub uptime: Option<String>,
20    pub packages: Option<String>,
21    pub shell: Option<String>,
22    pub wm: Option<String>,
23    pub de: Option<String>,
24    pub cpu: Option<String>,
25    pub gpu: Option<Vec<String>>,
26    pub memory: Option<String>,
27    pub disk: Option<Vec<(String, String)>>,
28    pub resolution: Option<String>,
29    pub theme: Option<String>,
30    pub battery: Option<Vec<String>>,
31    pub song: Option<SongInfo>,
32    pub colors: Option<String>,
33}
34
35impl From<Data> for SystemInfo {
36    fn from(value: Data) -> Self {
37        let host = match (&value.username, &value.hostname) {
38            (Some(user), Some(host)) => Some(format!("{user}@{host}")),
39            (_, Some(host)) => Some(host.clone()),
40            _ => None,
41        };
42
43        Self {
44            protocol_version: PROTOCOL_VERSION,
45            username: value.username,
46            hostname: value.hostname,
47            host,
48            os: value.os,
49            distro: value.distro,
50            model: value.model,
51            kernel: value.kernel,
52            os_age: value.os_age,
53            uptime: value.uptime,
54            packages: value.packages,
55            shell: value.shell,
56            wm: value.wm,
57            de: value.de,
58            cpu: value.cpu,
59            gpu: value.gpu,
60            memory: value.memory,
61            disk: value.disk,
62            resolution: value.resolution,
63            theme: value.theme,
64            battery: value.battery,
65            song: value.song,
66            colors: value.colors,
67        }
68    }
69}
70
71impl From<&SystemInfo> for Data {
72    fn from(value: &SystemInfo) -> Self {
73        Data {
74            username: value.username.clone(),
75            hostname: value.hostname.clone(),
76            os: value.os.clone(),
77            distro: value.distro.clone(),
78            model: value.model.clone(),
79            kernel: value.kernel.clone(),
80            os_age: value.os_age.clone(),
81            uptime: value.uptime.clone(),
82            packages: value.packages.clone(),
83            shell: value.shell.clone(),
84            wm: value.wm.clone(),
85            de: value.de.clone(),
86            cpu: value.cpu.clone(),
87            gpu: value.gpu.clone(),
88            memory: value.memory.clone(),
89            disk: value.disk.clone(),
90            resolution: value.resolution.clone(),
91            theme: value.theme.clone(),
92            battery: value.battery.clone(),
93            song: value.song.clone(),
94            colors: value.colors.clone(),
95        }
96    }
97}