1use serde_json::Value;
2
3use crate::error::{ApiError, Error};
4use crate::jwt::decode_jwt;
5
6#[derive(Debug, serde::Serialize, serde::Deserialize)]
8pub enum Message {
9 Text(String),
11 Struct(Value),
13 Encrypted(String),
19}
20
21impl TryFrom<Message> for String {
22 type Error = ApiError;
23
24 fn try_from(message: Message) -> Result<Self, Self::Error> {
25 match message {
26 Message::Text(text) => Ok(text),
27 Message::Struct(value) => {
28 if let Ok(json) = serde_json::to_string_pretty(&value) {
29 Ok(json)
30 } else {
31 Ok(value.to_string())
32 }
33 }
34 Message::Encrypted(token) => {
35 let hmac_secret =
36 std::env::var("JWT_SECRET").map_err(|_| Error::NoJWTSecretFound)?;
37
38 let prompt = decode_jwt(&token, &hmac_secret).map(|c| c.prompt)?;
39
40 Ok(prompt)
41 }
42 }
43 }
44}