use serde::Serialize;
use std::borrow::Cow;
#[cfg(test)]
mod tests;
#[derive(Serialize, Debug, PartialEq)]
pub struct Notification<'a> {
#[serde(skip_serializing_if = "Option::is_none")]
badge: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
body: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
body_loc_args: Option<Vec<Cow<'a, str>>>,
#[serde(skip_serializing_if = "Option::is_none")]
body_loc_key: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
click_action: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
color: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
icon: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
sound: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
tag: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
title: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
title_loc_args: Option<Vec<Cow<'a, str>>>,
#[serde(skip_serializing_if = "Option::is_none")]
title_loc_key: Option<&'a str>,
}
#[derive(Default)]
pub struct NotificationBuilder<'a> {
title: Option<&'a str>,
body: Option<&'a str>,
icon: Option<&'a str>,
sound: Option<&'a str>,
badge: Option<&'a str>,
tag: Option<&'a str>,
color: Option<&'a str>,
click_action: Option<&'a str>,
body_loc_key: Option<&'a str>,
body_loc_args: Option<Vec<Cow<'a, str>>>,
title_loc_key: Option<&'a str>,
title_loc_args: Option<Vec<Cow<'a, str>>>,
}
impl<'a> NotificationBuilder<'a> {
pub fn new() -> NotificationBuilder<'a> {
Self::default()
}
pub fn title(&mut self, title: &'a str) -> &mut Self {
self.title = Some(title);
self
}
pub fn body(&mut self, body: &'a str) -> &mut Self {
self.body = Some(body);
self
}
pub fn icon(&mut self, icon: &'a str) -> &mut Self {
self.icon = Some(icon);
self
}
pub fn sound(&mut self, sound: &'a str) -> &mut Self {
self.sound = Some(sound);
self
}
pub fn badge(&mut self, badge: &'a str) -> &mut Self {
self.badge = Some(badge);
self
}
pub fn tag(&mut self, tag: &'a str) -> &mut Self {
self.tag = Some(tag);
self
}
pub fn color(&mut self, color: &'a str) -> &mut Self {
self.color = Some(color);
self
}
pub fn click_action(&mut self, click_action: &'a str) -> &mut Self {
self.click_action = Some(click_action);
self
}
pub fn body_loc_key(&mut self, body_loc_key: &'a str) -> &mut Self {
self.body_loc_key = Some(body_loc_key);
self
}
pub fn body_loc_args<S>(&mut self, body_loc_args: &'a [S]) -> &mut Self
where
S: Into<Cow<'a, str>> + AsRef<str>,
{
let converted = body_loc_args.iter().map(|a| a.as_ref().into()).collect();
self.body_loc_args = Some(converted);
self
}
pub fn title_loc_key(&mut self, title_loc_key: &'a str) -> &mut Self {
self.title_loc_key = Some(title_loc_key);
self
}
pub fn title_loc_args<S>(&mut self, title_loc_args: &'a [S]) -> &mut Self
where
S: Into<Cow<'a, str>> + AsRef<str>,
{
let converted = title_loc_args.iter().map(|a| a.as_ref().into()).collect();
self.title_loc_args = Some(converted);
self
}
pub fn finalize(self) -> Notification<'a> {
Notification {
title: self.title,
body: self.body,
icon: self.icon,
sound: self.sound,
badge: self.badge,
tag: self.tag,
color: self.color,
click_action: self.click_action,
body_loc_key: self.body_loc_key,
body_loc_args: self.body_loc_args,
title_loc_key: self.title_loc_key,
title_loc_args: self.title_loc_args,
}
}
}