mm_client_common/
session.rs

1// Copyright 2024 Colin Marc <hi@colinmarc.com>
2//
3// SPDX-License-Identifier: MIT
4
5use std::time;
6
7use mm_protocol as protocol;
8pub use protocol::ApplicationImageFormat;
9
10use crate::display_params;
11use crate::validation::*;
12
13/// A launchable application on the server.
14#[derive(Debug, Clone, PartialEq, Eq, uniffi::Record)]
15pub struct Application {
16    pub id: String,
17    pub description: String,
18    pub folder: Vec<String>,
19    pub images_available: Vec<ApplicationImageFormat>,
20}
21
22impl TryFrom<protocol::application_list::Application> for Application {
23    type Error = ValidationError;
24
25    fn try_from(value: protocol::application_list::Application) -> Result<Self, Self::Error> {
26        let images_available = value
27            .images_available
28            .into_iter()
29            .map(|v| match v.try_into() {
30                Err(_) | Ok(protocol::ApplicationImageFormat::Unknown) => {
31                    Err(ValidationError::InvalidEnum("images_available".into()))
32                }
33                Ok(v) => Ok(v),
34            })
35            .collect::<Result<Vec<_>, _>>()?;
36
37        Ok(Application {
38            id: value.id,
39            description: value.description,
40            folder: value.folder,
41            images_available,
42        })
43    }
44}
45
46/// A running session on the server.
47#[derive(Debug, Clone, PartialEq, Eq, uniffi::Record)]
48pub struct Session {
49    pub id: u64,
50    pub application_id: String,
51    pub start: time::SystemTime,
52    pub display_params: display_params::DisplayParams,
53}
54
55impl TryFrom<protocol::session_list::Session> for Session {
56    type Error = ValidationError;
57
58    fn try_from(msg: protocol::session_list::Session) -> Result<Self, Self::Error> {
59        let start = match required_field!(msg.session_start)?.try_into() {
60            Ok(ts) => Ok(ts),
61            Err(_) => Err(ValidationError::InvalidTimestamp(
62                "session_start".to_string(),
63            )),
64        }?;
65
66        Ok(Session {
67            id: msg.session_id,
68            application_id: msg.application_id,
69            start,
70            display_params: required_field!(msg.display_params)?.try_into()?,
71        })
72    }
73}