use std::fmt;
use serde::{Serialize, Deserialize};
#[derive(Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Channel {
#[serde(skip_serializing_if = "Option::is_none")]
pub payload: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resource_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resource_uri: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expiration: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "type")]
pub channel_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub address: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub params: Option<serde_json::Map<String, serde_json::Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub kind: Option<String>,
}
impl fmt::Debug for Channel {
fn fmt( &self, f: &mut fmt::Formatter<'_> ) -> fmt::Result {
f.debug_struct("Channel")
.field("payload", &self.payload)
.field("id", &self.id)
.field("resource_id", &self.resource_id)
.field("resource_uri", &self.resource_uri)
.field("token", &format_args!("[hidden for security]"))
.field("expiration", &self.expiration)
.field("channel_type", &self.channel_type)
.field("address", &self.address)
.field("params", &self.params)
.field("kind", &self.kind)
.finish()
}
}
impl fmt::Display for Channel {
fn fmt( &self, f: &mut fmt::Formatter<'_> ) -> fmt::Result {
let json = serde_json::to_string_pretty(&self)
.unwrap_or( format!("unable to parse JSON, this is the debug view:\n{:#?}", self) );
write!(f, "{}", json)
}
}
impl Default for Channel {
fn default() -> Self {
Self {
payload: Default::default(),
id: Default::default(),
resource_id: Default::default(),
resource_uri: Default::default(),
token: Default::default(),
expiration: Default::default(),
channel_type: Some( "web_hook".to_string() ),
address: Default::default(),
params: Default::default(),
kind: Default::default(),
}
}
}
#[doc(hidden)]
impl From<&Self> for Channel {
fn from( reference: &Self ) -> Self {
reference.clone()
}
}
impl Channel {
pub fn new() -> Self {
Self { ..Default::default() }
}
pub fn from<T, U> ( channel_id: T, address: U ) -> Self
where
T: AsRef<str>,
U: AsRef<str>,
{
Self {
id: Some( channel_id.as_ref().to_string() ),
address: Some( address.as_ref().to_string() ),
..Default::default()
}
}
}