Skip to content

Commit

Permalink
Add serde_json, serde_yaml, smol-timeout, tracing, and tracing-subscr…
Browse files Browse the repository at this point in the history
…iber dependencies; implement server list retrieval and settings UI in geph5-client-gui
  • Loading branch information
nullchinchilla committed Apr 4, 2024
1 parent 795988c commit 99834f5
Show file tree
Hide file tree
Showing 6 changed files with 85 additions and 6 deletions.
5 changes: 5 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 6 additions & 1 deletion binaries/geph5-client-gui/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,9 @@ poll-promise = "0.3.0"
smolscale = "0.4.4"
futures-util = "0.3.30"
smol = "2.0.0"
geph5-broker-protocol={path="../../libraries/geph5-broker-protocol"}
geph5-broker-protocol={path="../../libraries/geph5-broker-protocol"}
serde_yaml = "0.9.34"
smol-timeout = "0.6.0"
tracing = "0.1.40"
tracing-subscriber = "0.3.18"
serde_json = "1.0.115"
42 changes: 38 additions & 4 deletions binaries/geph5-client-gui/src/dashboard.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
use std::time::Duration;

use anyhow::Context as _;
use futures_util::{future::Shared, FutureExt};
use geph5_broker_protocol::ExitList;
use poll_promise::Promise;
use geph5_broker_protocol::{BrokerClient, ExitList};

use smol::Task;
use smol_timeout::TimeoutExt as _;

use crate::l10n::l10n;
use crate::{l10n::l10n, settings::get_config};

pub struct Dashboard {
selected_server: Option<(String, String)>,
Expand Down Expand Up @@ -43,5 +47,35 @@ fn render_exit_selection(selection: &Option<(String, String)>) -> String {
}

async fn get_server_list() -> ExitList {
smol::future::pending().await
loop {
let fallible = async {
let broker_client = get_broker_client()
.await?
.context("no broker client available")?;
let exits = broker_client
.get_exits()
.timeout(Duration::from_secs(10))
.await
.context("timeout")??
.map_err(|e| anyhow::anyhow!(e))?
.inner;
anyhow::Ok(exits)
};
match fallible.await {
Ok(res) => return res,
Err(err) => {
tracing::warn!(err = debug(err), "error getting server list");
smol::Timer::after(Duration::from_secs(1)).await;
}
}
}
}

async fn get_broker_client() -> anyhow::Result<Option<BrokerClient>> {
let config = get_config()?;
if let Some(src) = config.broker {
Ok(Some(BrokerClient::from(src.rpc_transport())))
} else {
Ok(None)
}
}
17 changes: 16 additions & 1 deletion binaries/geph5-client-gui/src/main.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
mod dashboard;
mod l10n;
mod prefs;
mod settings;
use std::time::Duration;

use dashboard::Dashboard;
Expand All @@ -9,9 +10,23 @@ use egui::{Color32, FontData, FontDefinitions, FontFamily, Visuals};
use l10n::l10n;
use native_dialog::MessageType;
use prefs::{pref_read, pref_write};
use settings::render_settings;
use tap::Tap as _;
use tracing_subscriber::{layer::SubscriberExt as _, util::SubscriberInitExt, EnvFilter};

fn main() {
tracing_subscriber::registry()
.with(
tracing_subscriber::fmt::layer()
.compact()
.with_writer(std::io::stderr),
)
.with(
EnvFilter::builder()
.with_default_directive("geph5=debug".parse().unwrap())
.from_env_lossy(),
)
.init();
// default prefs
for (key, value) in [("lang", "en")] {
if pref_read(key).is_err() {
Expand Down Expand Up @@ -98,7 +113,7 @@ impl eframe::App for App {
let result = egui::CentralPanel::default().show(ctx, |ui| match self.selected_tab {
TabName::Dashboard => self.dashboard.render(ui),
TabName::Logs => Ok(()),
TabName::Settings => Ok(()),
TabName::Settings => render_settings(ui),
});

if let Err(err) = result.inner {
Expand Down
19 changes: 19 additions & 0 deletions binaries/geph5-client-gui/src/settings.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
use geph5_client::Config;

use crate::prefs::{pref_read, pref_write};

pub fn get_config() -> anyhow::Result<Config> {
let settings = pref_read("settings")?;
let yaml: serde_yaml::Value = serde_yaml::from_str(&settings)?;
let json: serde_json::Value = serde_json::to_value(&yaml)?;
Ok(serde_json::from_value(json)?)
}

pub fn render_settings(ui: &mut egui::Ui) -> anyhow::Result<()> {
let mut settings_yaml = pref_read("settings").unwrap_or_default().to_string();
ui.centered_and_justified(|ui| {
egui::ScrollArea::vertical().show(ui, |ui| ui.code_editor(&mut settings_yaml))
});
pref_write("settings", &settings_yaml)?;
Ok(())
}
1 change: 1 addition & 0 deletions binaries/geph5-client/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
pub use broker::broker_client;
pub use client::Client;
pub use client::Config;

Expand Down

0 comments on commit 99834f5

Please sign in to comment.