Skip to main content

binary_option_tools_core/general/
traits.rs

1use core::{error, fmt, hash};
2
3use async_channel::Sender;
4use async_trait::async_trait;
5use serde::{de::DeserializeOwned, Serialize};
6use tokio::net::TcpStream;
7use tokio_tungstenite::{tungstenite::Message, MaybeTlsStream, WebSocketStream};
8
9use crate::error::BinaryOptionsResult;
10
11use super::{
12    client::SenderMessage,
13    types::{Data, MessageType, UserRequest},
14};
15
16pub trait Credentials: Clone + Send + Sync {}
17
18#[async_trait]
19pub trait DataHandler: Clone + Send + Sync {
20    type Transfer: MessageTransfer;
21
22    async fn update(&self, message: &Self::Transfer) -> BinaryOptionsResult<()>;
23}
24
25#[async_trait]
26pub trait Callback: Clone + Send + Sync {
27    type T: DataHandler;
28    type Transfer: MessageTransfer;
29
30    async fn call(
31        &self,
32        data: Data<Self::T, Self::Transfer>,
33        sender: &SenderMessage<Self::Transfer>,
34    ) -> BinaryOptionsResult<()>;
35}
36
37pub trait MessageTransfer:
38    DeserializeOwned + Clone + Into<Message> + Send + Sync + error::Error + fmt::Debug + fmt::Display
39{
40    type Error: Into<Self> + Clone + error::Error;
41    type TransferError: error::Error;
42    type Info: MessageInformation;
43
44    fn info(&self) -> Self::Info;
45
46    fn error(&self) -> Option<Self::Error>;
47
48    fn to_error(&self) -> Self::TransferError;
49
50    fn user_request(&self) -> Option<UserRequest<Self>>;
51
52    fn new_user(request: UserRequest<Self>) -> Self;
53
54    fn error_info(&self) -> Option<Vec<Self::Info>>;
55}
56
57pub trait MessageInformation:
58    Serialize + DeserializeOwned + Clone + Send + Sync + Eq + hash::Hash + fmt::Debug + fmt::Display
59{
60    fn none(&self) -> Self;
61}
62
63#[async_trait]
64/// Every struct that implements MessageHandler will recieve a message and should return
65pub trait MessageHandler: Clone + Send + Sync {
66    type Transfer: MessageTransfer;
67
68    async fn process_message(
69        &self,
70        message: &Message,
71        previous: &Option<<<Self as MessageHandler>::Transfer as MessageTransfer>::Info>,
72        sender: &Sender<Message>,
73    ) -> BinaryOptionsResult<(Option<MessageType<Self::Transfer>>, bool)>;
74}
75
76#[async_trait]
77pub trait Connect: Clone + Send + Sync {
78    type Creds: Credentials;
79    // type Uris: Iterator<Item = String>;
80
81    async fn connect(
82        &self,
83        creds: Self::Creds,
84    ) -> BinaryOptionsResult<WebSocketStream<MaybeTlsStream<TcpStream>>>;
85}