mm_client_common/
session.rs1use std::time;
6
7use mm_protocol as protocol;
8pub use protocol::ApplicationImageFormat;
9
10use crate::display_params;
11use crate::validation::*;
12
13#[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#[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}