good stopping point - backend now pushes updates to frontend in consistent JSON format
This commit is contained in:
parent
5e00a8080d
commit
a6fd15c1b1
|
@ -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<GreetingRequest>) -> 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");
|
||||
}
|
||||
|
|
|
@ -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
|
||||
]
|
||||
|
|
Loading…
Reference in a new issue