2025-04-16 06:27:08 +03:00
|
|
|
use std::{fmt::Display, str::FromStr};
|
2025-04-14 16:13:42 +03:00
|
|
|
|
2025-04-11 04:58:16 +03:00
|
|
|
use chrono::{DateTime, Utc};
|
|
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
|
2025-04-16 06:27:08 +03:00
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
|
|
pub struct UserAndSignal {
|
|
|
|
pub user: User,
|
|
|
|
pub signal: Signal,
|
|
|
|
}
|
|
|
|
impl UserAndSignal {
|
|
|
|
pub async fn new(user: User, signal: Signal) -> Self {
|
|
|
|
UserAndSignal { user, signal }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
|
|
pub struct User {
|
|
|
|
pub username: String,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
2025-04-14 16:13:42 +03:00
|
|
|
pub enum Error {
|
2025-04-16 06:27:08 +03:00
|
|
|
UnexpectedSignalType(SignalType),
|
|
|
|
InvalidSignalType(String),
|
2025-04-14 16:13:42 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
impl std::error::Error for Error {
|
|
|
|
fn cause(&self) -> Option<&dyn std::error::Error> {
|
|
|
|
self.source()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Display for Error {
|
|
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
|
|
match self {
|
2025-04-16 06:27:08 +03:00
|
|
|
Error::UnexpectedSignalType(signal_type) => {
|
|
|
|
write!(f, "Unexpected Signal Type: {}", signal_type)
|
|
|
|
}
|
|
|
|
Error::InvalidSignalType(invalid_signal_type) => {
|
|
|
|
write!(f, "Invalid Signal Type: {}", invalid_signal_type)
|
2025-04-14 16:13:42 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
|
2025-04-14 04:58:44 +03:00
|
|
|
pub enum SignalType {
|
|
|
|
Auth,
|
|
|
|
Offer,
|
|
|
|
Answer,
|
2025-04-16 06:27:08 +03:00
|
|
|
ICECandidate,
|
2025-04-11 04:58:16 +03:00
|
|
|
}
|
2025-04-13 04:55:33 +03:00
|
|
|
|
2025-04-16 06:27:08 +03:00
|
|
|
impl FromStr for SignalType {
|
|
|
|
type Err = Error;
|
|
|
|
|
|
|
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
|
|
|
match s {
|
|
|
|
"Auth" => Ok(SignalType::Auth),
|
|
|
|
"Offer" => Ok(SignalType::Offer),
|
|
|
|
"Answer" => Ok(SignalType::Answer),
|
|
|
|
_ => Err(Error::InvalidSignalType(s.to_owned())),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
2025-04-14 04:58:44 +03:00
|
|
|
pub struct Signal {
|
2025-04-14 16:13:42 +03:00
|
|
|
signal_type: SignalType,
|
|
|
|
data: String,
|
2025-04-14 04:58:44 +03:00
|
|
|
time: DateTime<Utc>,
|
2025-04-13 04:55:33 +03:00
|
|
|
}
|
2025-04-14 04:58:44 +03:00
|
|
|
|
2025-04-14 16:13:42 +03:00
|
|
|
impl Display for SignalType {
|
|
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
|
|
match self {
|
|
|
|
SignalType::Auth => write!(f, "Auth"),
|
|
|
|
SignalType::Offer => write!(f, "Offer"),
|
|
|
|
SignalType::Answer => write!(f, "Answer"),
|
2025-04-16 06:27:08 +03:00
|
|
|
SignalType::ICECandidate => write!(f, "ICE Candidate"),
|
2025-04-14 16:13:42 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-04-14 04:58:44 +03:00
|
|
|
impl Signal {
|
2025-04-14 16:13:42 +03:00
|
|
|
pub fn new(signal_type: &SignalType, data: &String) -> Signal {
|
2025-04-14 04:58:44 +03:00
|
|
|
let signal_type = *signal_type;
|
|
|
|
let data = data.to_owned();
|
|
|
|
Signal {
|
|
|
|
signal_type,
|
|
|
|
data,
|
|
|
|
time: DateTime::default(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-04-14 16:13:42 +03:00
|
|
|
pub fn get_signal_type(&self) -> SignalType {
|
|
|
|
self.signal_type
|
|
|
|
}
|
|
|
|
pub fn get_data(&self) -> String {
|
|
|
|
self.data.to_owned()
|
|
|
|
}
|
2025-04-14 04:58:44 +03:00
|
|
|
pub fn get_time(&self) -> DateTime<Utc> {
|
|
|
|
self.time
|
|
|
|
}
|
2025-04-13 04:55:33 +03:00
|
|
|
}
|