From a6fd15c1b1907b2dcec7363e6e5789071ab8dbfb Mon Sep 17 00:00:00 2001 From: Yehowshua Immanuel Date: Thu, 2 Jan 2025 11:33:01 -0500 Subject: [PATCH] good stopping point - backend now pushes updates to frontend in consistent JSON format --- backend/src/main.rs | 21 +++++++++++++++++---- frontend/src/Page/Landing.elm | 26 +++++++++----------------- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/backend/src/main.rs b/backend/src/main.rs index 56bb0ed..929de35 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -5,8 +5,8 @@ use actix_web_actors::ws; use log::info; use serde::{Deserialize, Serialize}; use std::{fs, time::Duration}; +use chrono::Local; -mod landing; /// Greeting API structures #[derive(Serialize, Deserialize)] @@ -19,9 +19,14 @@ struct GreetingResponse { message: String, } +#[derive(Serialize)] +pub struct Landing { + pub time : String +} + #[derive(Serialize)] enum ToFrontend { - Landing(landing::Landing) + Landing(Landing) } async fn greet(req: web::Json) -> impl Responder { @@ -40,8 +45,16 @@ impl Actor for MyWebSocket { info!("WebSocket actor started"); // Send messages every second ctx.run_interval(Duration::from_secs(1), |_, ctx| { - let message = format!("{{\"time\" : \"{:?}\" }}", chrono::Local::now()); - ctx.text(message); + // Format the current time as HH:mm:ss + let current_time = Local::now().format("%H:%M:%S").to_string(); + let message = ToFrontend::Landing(Landing { time: current_time }); + + // Serialize the message to JSON + if let Ok(json_message) = serde_json::to_string(&message) { + ctx.text(json_message); + } else { + info!("Failed to serialize the message"); + } }); info!("Leaving started"); } diff --git a/frontend/src/Page/Landing.elm b/frontend/src/Page/Landing.elm index 1b2f048..4ad6c19 100644 --- a/frontend/src/Page/Landing.elm +++ b/frontend/src/Page/Landing.elm @@ -19,7 +19,7 @@ type alias Landing = { } type Msg = ToFrontend Landing - | Time String + | DecodeError Decode.Error | NoOp init : () -> Model @@ -27,23 +27,15 @@ init flags = { time = "time not yet set" } -decodeMessage : String -> String -decodeMessage message = +decodeToFrontend message = let - decodedMessage = Decode.decodeString (Decode.field "time" Decode.string) message + decodeTime = Decode.field "time" Decode.string |> Decode.map Landing + decodeLanding = Decode.field "Landing" decodeTime |> Decode.map ToFrontend + decodedMessage = Decode.decodeString decodeLanding message in case decodedMessage of Ok decoded -> decoded - Err err -> "failed to decode" ++ message - -decodeMessageOld : String -> String -decodeMessageOld message = - let - decodedMessage = Decode.decodeString (Decode.field "time" Decode.string) message - in - case decodedMessage of - Ok decoded -> decoded - Err err -> "failed to decode" ++ message + Err err -> DecodeError err subscriptions : Model -> Sub Msg subscriptions model = @@ -52,19 +44,19 @@ subscriptions model = (\_ -> NoOp) (\_ -> NoOp) (\_ -> NoOp) - (\message -> (message.data |> decodeMessageOld |> Time)) + (\message -> (message.data |> decodeToFrontend)) (\_ -> NoOp) ) update : Msg -> Model -> (Model, Cmd Msg) update msg model = case msg of - Time time -> ( {model | time = time}, Cmd.none ) + ToFrontend landing -> ( {model | time = landing.time}, Cmd.none ) _ -> (model, Cmd.none) view : Model -> Element Msg view model = Element.column [] [ Element.text "Landing", - Element.text <| "Time is : " ++ model.time + Element.text <| "Current time is : " ++ model.time ]