cookie_agent_protocol/session/
transport.rs1use std::fmt;
2
3use async_trait::async_trait;
4use serde_json::Value;
5use thiserror::Error;
6
7#[derive(Clone, PartialEq)]
9pub enum MessageFrame {
10 Text(String),
11 Value(Value),
12}
13
14impl fmt::Debug for MessageFrame {
15 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
16 match self {
17 Self::Text(_) => formatter.write_str("MessageFrame::Text(<redacted>)"),
18 Self::Value(_) => formatter.write_str("MessageFrame::Value(<redacted>)"),
19 }
20 }
21}
22
23#[async_trait]
25pub trait Transport: Send {
26 async fn send(&mut self, frame: MessageFrame) -> Result<(), TransportError>;
27 async fn recv(&mut self) -> Result<Option<MessageFrame>, TransportError>;
28}
29
30pub use Transport as MessageStream;
31
32#[derive(Debug, Error)]
33pub enum TransportError {
34 #[error("transport closed")]
35 Closed,
36 #[error("invalid transport frame: {0}")]
37 InvalidFrame(#[from] serde_json::Error),
38 #[error("transport error: {0}")]
39 Other(String),
40}