DSL fixes

This commit is contained in:
Abdulla Abdurakhmanov 2020-07-12 17:34:52 +03:00
parent 9264cf3330
commit 2020ed1cc6
6 changed files with 77 additions and 35 deletions

View file

@ -17,3 +17,4 @@ chrono = { version = "0.4", features = ["serde"] }
hyper = "0.13"
log = "0.4"
fern = { version = "0.6", features = ["colored"] }
rsb_derive = "0.2"

View file

@ -14,6 +14,9 @@ use log::*;
use std::sync::Arc;
mod templates;
//use templates::*;
#[allow(dead_code)]
async fn test_client() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
let sb: SlackSectionBlock = SlackSectionBlock::new().with_block_id("test".into());
@ -23,7 +26,7 @@ async fn test_client() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
let section_block = SlackSectionBlock::new()
.with_text(md!("hey, {}", 10))
.with_fields(slack_items![
.with_fields(slack_blocks![
some(md!("hey1")),
some(pt!("hey2")),
optionally( sb_ser.is_empty() => md!("hey"))
@ -37,19 +40,19 @@ async fn test_client() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
);
let context_block: SlackContextBlock = SlackContextBlock::new(slack_blocks![
some(SlackBlockImageElement::new(
some_into(SlackBlockImageElement::new(
"http://example.net/img1".into(),
"text 1".into()
)),
some(SlackBlockImageElement::new(
some_into(SlackBlockImageElement::new(
"http://example.net/img2".into(),
"text 2".into()
))
]);
let blocks: Vec<SlackBlock> = slack_blocks![
some ( section_block ),
optionally( !sb_ser.is_empty() => context_block)
some_into ( section_block ),
optionally_into( !sb_ser.is_empty() => context_block )
];
println!("{:#?}", blocks);

View file

@ -0,0 +1,26 @@
use rsb_derive::Builder;
use slack_morphism_models::blocks::*;
use slack_morphism_models::*;
#[derive(Debug, Clone, Builder)]
pub struct WelcomeMessageTemplateParams {
user_id: SlackUserId,
}
impl SlackMessageTemplate for WelcomeMessageTemplateParams {
fn render_template(&self) -> SlackMessageContent {
SlackMessageContent::new()
.with_text(format!("Hey {}", Self::fmt_user_id(&self.user_id)))
.with_blocks(slack_blocks![
some_into(
SlackSectionBlock::new()
.with_text(md!("Hey {}", Self::fmt_user_id(&self.user_id)))
),
some_into(SlackDividerBlock::new()),
some_into(SlackContextBlock::new(slack_blocks![
some_into(SlackBlockImageElement::new("".into(), "".into())),
some(md!("This is an example of block message"))
]))
])
}
}

View file

@ -23,25 +23,10 @@ macro_rules! pt {
}
#[macro_export]
macro_rules! slack_optional_item {
macro_rules! slack_block_item {
(optionally ($pred:expr => $item:expr)) => {{
if $pred {
Some($item)
} else {
None
}
}};
(some $item:expr) => {{
Some($item)
}};
}
#[macro_export]
macro_rules! slack_optional_item_into {
(optionally ($pred:expr => $item:expr)) => {{
if $pred {
slack_optional_item_into! (some $item)
slack_block_item! (some $item)
}
else {
None
@ -49,6 +34,19 @@ macro_rules! slack_optional_item_into {
}};
(some $item:expr) => {{
Some($item)
}};
(optionally_into ($pred:expr => $item:expr)) => {{
if $pred {
slack_block_item! (some_into $item)
}
else {
None
}
}};
(some_into $item:expr ) => {{
Some($item.into())
}};
}
@ -60,19 +58,7 @@ macro_rules! slack_blocks {
($($pred : tt($item:expr $(=> $item_r:expr)?)),+) => {{
vec![
$(slack_optional_item_into! ($pred($item $(=> $item_r)?))),*
$(slack_block_item! ($pred($item $(=> $item_r)?))),*
].into_iter().flatten().collect()
}};
}
#[macro_export]
macro_rules! slack_items {
() => { vec![] };
($($pred : tt($item:expr $(=> $item_r:expr)?)),+) => {{
let items = vec![
$(slack_optional_item! ($pred($item $(=> $item_r)?))),*
];
items.into_iter().flatten().collect()
}};
}

View file

@ -5,6 +5,10 @@ use rsb_derive::Builder;
use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
mod templates;
pub use templates::*;
#[skip_serializing_none]
#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
pub struct SlackMessageOrigin {

View file

@ -0,0 +1,22 @@
use rvstruct::ValueStruct;
use crate::{SlackMessageContent, SlackUserId};
use chrono::prelude::*;
pub trait SlackMessageTemplate {
fn render_template(&self) -> SlackMessageContent;
fn fmt_user_id(uid: &SlackUserId) -> String {
format!("<@${}", uid.value())
}
fn fmt_date<TZ: TimeZone>(date: DateTime<TZ>) -> String {
format!(
"<!date^${timestamp}^${token_string}${link_part}|${fallback}>",
timestamp = date.timestamp(),
token_string = "",
link_part = "",
fallback = ""
)
}
}