Skip to main content

rpc_agent/
message.rs

1use serde_json::Value;
2
3use crate::error::{ApiError, Error};
4use crate::jwt::decode_jwt;
5
6/// Represents a message to be sent to the AI provider.
7#[derive(Debug, serde::Serialize, serde::Deserialize)]
8pub enum Message {
9    /// A plain text message.
10    Text(String),
11    /// A structured message.
12    Struct(Value),
13    /// A JWT-backed message whose claims will be validated and whose prompt will be extracted
14    /// before being sent.
15    ///
16    /// Note: This does not provide confidentiality by itself; it relies on `JWT_SECRET` to
17    /// validate/decode the token.
18    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}