Merge pull request #4 from Tahinli/dev

Dev
This commit is contained in:
Ahmet Kaan GÜMÜŞ 2024-03-15 00:37:44 +00:00 committed by GitHub
commit 1ae578cc70
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 118 additions and 41 deletions

View file

@ -1,6 +1,20 @@
use serde::{Deserialize, Serialize};
pub mod routing; pub mod routing;
pub mod read;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct AppState{ pub struct AppState{
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
enum ServerStatus{
Alive,
Unstable,
Dead,
}
#[derive(Debug, Clone, PartialEq, Serialize,Deserialize)]
enum CoinStatus{
Tail,
Head,
} }

View file

@ -1,9 +1,8 @@
use crate::AppState; use crate::{AppState, ServerStatus, CoinStatus};
use axum::{extract::State, http::StatusCode, response::IntoResponse, routing::get, Json, Router}; use axum::{extract::State, http::StatusCode, response::IntoResponse, routing::get, Json, Router};
use tower_http::cors::CorsLayer; use tower_http::cors::CorsLayer;
use rand::prelude::*; use rand::prelude::*;
pub async fn routing(State(state): State<AppState>) -> Router { pub async fn routing(State(state): State<AppState>) -> Router {
Router::new() Router::new()
.route("/", get(alive)) .route("/", get(alive))
@ -14,7 +13,7 @@ pub async fn routing(State(state): State<AppState>) -> Router {
async fn alive() -> impl IntoResponse { async fn alive() -> impl IntoResponse {
let alive_json = serde_json::json!({ let alive_json = serde_json::json!({
"status":"Alive", "status":ServerStatus::Alive,
}); });
println!("{}", alive_json); println!("{}", alive_json);
(StatusCode::OK, Json(alive_json)) (StatusCode::OK, Json(alive_json))
@ -23,13 +22,13 @@ async fn alive() -> impl IntoResponse {
async fn flip_coin() -> impl IntoResponse { async fn flip_coin() -> impl IntoResponse {
let mut rng = rand::thread_rng(); let mut rng = rand::thread_rng();
let random:f64 = rng.gen(); let random:f64 = rng.gen();
let mut flip_status:String = "Tail".to_string(); let mut flip_status = CoinStatus::Tail;
if random > 0.5 { if random > 0.5 {
flip_status = "Head".to_string(); flip_status = CoinStatus::Head;
} }
let coin_json = serde_json::json!({ let coin_json = serde_json::json!({
"status":flip_status, "status":flip_status,
}); });
println!("{}", coin_json); println!("{}", coin_json);
(StatusCode::OK, Json(coin_json)) (StatusCode::OK, Json(coin_json))
} }

View file

@ -6,6 +6,7 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
async-std = "1.12.0"
dioxus = { version = "0.5.0-alpha.0", features = ["web"] } dioxus = { version = "0.5.0-alpha.0", features = ["web"] }
log = "0.4.21" log = "0.4.21"
reqwest = { version = "0.11.24", features = ["json"] } reqwest = { version = "0.11.24", features = ["json"] }

View file

@ -1,14 +1,44 @@
use std::time::Duration;
use async_std::task;
use dioxus::prelude::*; use dioxus::prelude::*;
use serde::Deserialize; use serde::Deserialize;
const SERVER_ADDRESS: &str = "https://localhost:2323"; const SERVER_ADDRESS: &str = "https://localhost:2323";
#[derive(Debug, Clone, PartialEq, Deserialize)] #[derive(Debug, Clone, PartialEq, Deserialize)]
struct ServerStatus{ enum Server{
status: String, Alive,
Unstable,
Dead,
}
impl Server {
fn to_string(&mut self) -> String{
match self {
Self::Alive => {String::from("Alive")},
Self::Unstable => {String::from("Unstable")},
Self::Dead => {String::from("Dead")},
}
}
} }
#[derive(Debug, Clone, PartialEq, Deserialize)] #[derive(Debug, Clone, PartialEq, Deserialize)]
struct CoinStatus{ enum Coin{
status: String, Tail,
Head,
}
impl Coin {
fn to_string(&mut self) -> String {
match self {
Self::Head => {String::from("Head")},
Self::Tail => {String::from("Tail")},
}
}
}
#[derive(Debug, Clone, PartialEq, Deserialize)]
struct ServerStatus {
status:Server,
}
#[derive(Debug, Clone, PartialEq, Deserialize)]
struct CoinStatus {
status:Coin,
} }
fn main() { fn main() {
@ -17,8 +47,27 @@ fn main() {
launch(app); launch(app);
} }
async fn server_status_check() ->Result<ServerStatus, reqwest::Error> { async fn server_status_check(mut server_status:Signal<ServerStatus>) ->ServerStatus {
Ok(reqwest::get(SERVER_ADDRESS).await.unwrap().json::<ServerStatus>().await.unwrap()) match reqwest::get(SERVER_ADDRESS).await {
Ok(response) => {
match response.json::<ServerStatus>().await {
Ok(_) => {
*server_status.write() = ServerStatus{status:Server::Alive,};
ServerStatus{status:Server::Alive,}
}
Err(err_val) => {
*server_status.write() = ServerStatus{status:Server::Dead,};
log::info!("{}", err_val);
ServerStatus{status:Server::Dead,}
}
}
}
Err(err_val) => {
*server_status.write() = ServerStatus{status:Server::Dead,};
log::info!("{}", err_val);
ServerStatus{status:Server::Dead,}
}
}
} }
async fn coin_status_check() -> Result<CoinStatus, reqwest::Error> { async fn coin_status_check() -> Result<CoinStatus, reqwest::Error> {
Ok(reqwest::get(format!("{}{}", SERVER_ADDRESS, "/coin")).await.unwrap().json::<CoinStatus>().await.unwrap()) Ok(reqwest::get(format!("{}{}", SERVER_ADDRESS, "/coin")).await.unwrap().json::<CoinStatus>().await.unwrap())
@ -46,38 +95,54 @@ fn page_base() ->Element {
} }
} }
} }
fn server_status_renderer() -> Element { fn server_status_renderer() -> Element {
let server_status = use_resource(move || server_status_check()); let server_check_time = 1_u64;
match &*server_status.value().read() { let mut server_status = use_signal(move || ServerStatus{status:Server::Unstable,});
Some(Ok(server_status)) => { let mut server_status_watchdog = use_signal(move|| false);
rsx! { let mut server_status_unstable = use_signal(move|| false);
h5 { let _server_status_task:Coroutine<()> = use_coroutine(|_| async move {
ShowServerStatus { server_status: server_status.clone() } loop {
task::sleep(Duration::from_secs(server_check_time)).await;
*server_status_watchdog.write() = true;
*server_status.write() = server_status_check(server_status).await;
*server_status_watchdog.write() = false;
};
});
let _server_status_watchdog_timer:Coroutine<()> = use_coroutine(|_| async move {
let mut watchdog_counter = 0_i8;
loop {
task::sleep(Duration::from_secs(2*server_check_time+1)).await;
if !server_status_watchdog() {
*server_status_unstable.write() = false;
} }
} if server_status_watchdog() {
for _i in 0..5 {
task::sleep(Duration::from_secs(1)).await;
if server_status_watchdog() {
watchdog_counter += 1;
}
}
}
if watchdog_counter > 4 {
*server_status_unstable.write() = true;
}
watchdog_counter = 0;
} }
Some(Err(err_val)) => { });
rsx! { rsx! {
h5 { if server_status_unstable() && server_status_watchdog() {
"Server Status: " ShowServerStatus {server_status:ServerStatus{status:Server::Dead,}}
{ err_val.to_string() }
}
}
} }
None => { else {
rsx! { ShowServerStatus {server_status:server_status()}
h5 {
"Server Status: Dead"
}
}
} }
} }
} }
fn coin_status_renderer() -> Element { fn coin_status_renderer() -> Element {
let is_loading = use_signal(|| false); let is_loading = use_signal(|| false);
let coin_result = use_signal(|| CoinStatus{status:"None".to_string(),}); let coin_result = use_signal(|| CoinStatus{status:Coin::Head,});
let call_coin = move |_| { let call_coin = move |_| {
spawn({ spawn({
to_owned![is_loading]; to_owned![is_loading];
@ -89,15 +154,13 @@ fn coin_status_renderer() -> Element {
is_loading.set(false); is_loading.set(false);
coin_result.set(coin_status); coin_result.set(coin_status);
} }
Err(err_val) => { Err(_) => {
is_loading.set(false); is_loading.set(false);
log::info!("{}", err_val);
} }
} }
} }
}); });
}; };
log::info!("{}", is_loading);
rsx! { rsx! {
div { div {
button { button {
@ -122,7 +185,7 @@ fn ShowServerStatus(server_status: ServerStatus) -> Element {
div { div {
div { class: "flex items-center", div { class: "flex items-center",
span { "Server Status: " } span { "Server Status: " }
span { { server_status.status } } span { { server_status.status.to_string() } }
} }
} }
} }
@ -133,7 +196,7 @@ fn ShowCoinStatus(coin_status: CoinStatus) -> Element {
div { div {
div { class: "flex items-center", div { class: "flex items-center",
span { "Coin Status: " } span { "Coin Status: " }
span { { coin_status.status } } span { { coin_status.status.to_string() } }
} }
} }
} }