1use std::borrow::Cow;
2
3use gtk::{glib, prelude::*};
4
5use crate::{session::VerificationKey, utils::matrix::MatrixIdUri};
6
7#[derive(Debug)]
11pub(crate) enum SessionIntent {
12 ShowMatrixId(MatrixIdUri),
14 ShowIdentityVerification(VerificationKey),
16}
17
18impl SessionIntent {
19 pub(crate) const SHOW_MATRIX_ID_APP_ACTION_NAME: &str = "app.show-matrix-id";
22
23 pub(crate) const SHOW_MATRIX_ID_ACTION_NAME: &str =
26 Self::SHOW_MATRIX_ID_APP_ACTION_NAME.split_at(4).1;
27
28 pub(crate) const SHOW_IDENTITY_VERIFICATION_APP_ACTION_NAME: &str =
31 "app.show-identity-verification";
32
33 pub(crate) const SHOW_IDENTITY_VERIFICATION_ACTION_NAME: &str =
36 Self::SHOW_IDENTITY_VERIFICATION_APP_ACTION_NAME
37 .split_at(4)
38 .1;
39
40 pub(crate) fn app_action_name(&self) -> &'static str {
42 match self {
43 SessionIntent::ShowMatrixId(_) => Self::SHOW_MATRIX_ID_APP_ACTION_NAME,
44 SessionIntent::ShowIdentityVerification(_) => {
45 Self::SHOW_IDENTITY_VERIFICATION_APP_ACTION_NAME
46 }
47 }
48 }
49
50 pub(crate) fn show_matrix_id_from_variant(variant: &glib::Variant) -> Option<(String, Self)> {
56 let SessionIntentActionParameter {
57 session_id,
58 payload,
59 } = variant.get()?;
60
61 Some((session_id, Self::ShowMatrixId(payload.get()?)))
62 }
63
64 pub(crate) fn show_identity_verification_from_variant(
71 variant: &glib::Variant,
72 ) -> Option<(String, Self)> {
73 let SessionIntentActionParameter {
74 session_id,
75 payload,
76 } = variant.get()?;
77
78 Some((session_id, Self::ShowIdentityVerification(payload.get()?)))
79 }
80
81 pub(crate) fn to_variant_with_session_id(&self, session_id: String) -> glib::Variant {
83 let payload = match self {
84 Self::ShowMatrixId(uri) => uri.to_variant(),
85 Self::ShowIdentityVerification(key) => key.to_variant(),
86 };
87
88 SessionIntentActionParameter {
89 session_id,
90 payload,
91 }
92 .to_variant()
93 }
94}
95
96impl StaticVariantType for SessionIntent {
97 fn static_variant_type() -> Cow<'static, glib::VariantTy> {
98 SessionIntentActionParameter::static_variant_type()
99 }
100}
101
102impl From<MatrixIdUri> for SessionIntent {
103 fn from(value: MatrixIdUri) -> Self {
104 Self::ShowMatrixId(value)
105 }
106}
107
108impl From<VerificationKey> for SessionIntent {
109 fn from(value: VerificationKey) -> Self {
110 Self::ShowIdentityVerification(value)
111 }
112}
113
114#[derive(Debug, Clone, glib::Variant)]
117struct SessionIntentActionParameter {
118 session_id: String,
120 payload: glib::Variant,
122}