summaryrefslogtreecommitdiffstats
path: root/native/src
diff options
context:
space:
mode:
Diffstat (limited to 'native/src')
-rw-r--r--native/src/command/action.rs6
-rw-r--r--native/src/lib.rs1
-rw-r--r--native/src/system.rs6
-rw-r--r--native/src/system/action.rs39
-rw-r--r--native/src/system/information.rs22
5 files changed, 74 insertions, 0 deletions
diff --git a/native/src/command/action.rs b/native/src/command/action.rs
index cd4309ed..1bb03cef 100644
--- a/native/src/command/action.rs
+++ b/native/src/command/action.rs
@@ -1,4 +1,5 @@
use crate::clipboard;
+use crate::system;
use crate::window;
use iced_futures::MaybeSend;
@@ -19,6 +20,9 @@ pub enum Action<T> {
/// Run a window action.
Window(window::Action),
+
+ /// Run a system action.
+ System(system::Action<T>),
}
impl<T> Action<T> {
@@ -38,6 +42,7 @@ impl<T> Action<T> {
Self::Future(future) => Action::Future(Box::pin(future.map(f))),
Self::Clipboard(action) => Action::Clipboard(action.map(f)),
Self::Window(window) => Action::Window(window),
+ Self::System(system) => Action::System(system.map(f)),
}
}
}
@@ -50,6 +55,7 @@ impl<T> fmt::Debug for Action<T> {
write!(f, "Action::Clipboard({:?})", action)
}
Self::Window(action) => write!(f, "Action::Window({:?})", action),
+ Self::System(action) => write!(f, "Action::System({:?})", action),
}
}
}
diff --git a/native/src/lib.rs b/native/src/lib.rs
index a37535a7..db60976f 100644
--- a/native/src/lib.rs
+++ b/native/src/lib.rs
@@ -48,6 +48,7 @@ pub mod program;
pub mod renderer;
pub mod subscription;
pub mod svg;
+pub mod system;
pub mod text;
pub mod touch;
pub mod user_interface;
diff --git a/native/src/system.rs b/native/src/system.rs
new file mode 100644
index 00000000..61c8ff29
--- /dev/null
+++ b/native/src/system.rs
@@ -0,0 +1,6 @@
+//! Access the native system.
+mod action;
+mod information;
+
+pub use action::Action;
+pub use information::Information;
diff --git a/native/src/system/action.rs b/native/src/system/action.rs
new file mode 100644
index 00000000..dea9536f
--- /dev/null
+++ b/native/src/system/action.rs
@@ -0,0 +1,39 @@
+use crate::system;
+
+use iced_futures::MaybeSend;
+use std::fmt;
+
+/// An operation to be performed on the system.
+pub enum Action<T> {
+ /// Query system information and produce `T` with the result.
+ QueryInformation(Box<dyn Closure<T>>),
+}
+
+pub trait Closure<T>: Fn(system::Information) -> T + MaybeSend {}
+
+impl<T, O> Closure<O> for T where T: Fn(system::Information) -> O + MaybeSend {}
+
+impl<T> Action<T> {
+ /// Maps the output of a system [`Action`] using the provided closure.
+ pub fn map<A>(
+ self,
+ f: impl Fn(T) -> A + 'static + MaybeSend + Sync,
+ ) -> Action<A>
+ where
+ T: 'static,
+ {
+ match self {
+ Self::QueryInformation(o) => {
+ Action::QueryInformation(Box::new(move |s| f(o(s))))
+ }
+ }
+ }
+}
+
+impl<T> fmt::Debug for Action<T> {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match self {
+ Self::QueryInformation(_) => write!(f, "Action::QueryInformation"),
+ }
+ }
+}
diff --git a/native/src/system/information.rs b/native/src/system/information.rs
new file mode 100644
index 00000000..fa4a835b
--- /dev/null
+++ b/native/src/system/information.rs
@@ -0,0 +1,22 @@
+/// Contains informations about the system (e.g. system name, processor, memory, graphics adapter).
+#[derive(Clone, Debug)]
+pub struct Information {
+ /// Contains the system name.
+ pub system_name: Option<String>,
+ /// Contains the kernel version.
+ pub system_kernel: Option<String>,
+ /// Contains the systme version.
+ pub system_version: Option<String>,
+ /// Contains the processor brand.
+ pub cpu_brand: String,
+ /// Contains the number of physical cores on the processor.
+ pub cpu_cores: Option<usize>,
+ /// Contains the total RAM size in KB.
+ pub memory_total: u64,
+ /// Contains the system used RAM size in KB.
+ pub memory_used: Option<u64>,
+ /// Contains the graphics backend.
+ pub graphics_backend: String,
+ /// Contains the graphics adapter.
+ pub graphics_adapter: String,
+}