#![allow(unused_macros)]
#[macro_export]
macro_rules! anyhow_Ok信令{ ($res:expr)=>{ anyhow_Ok($res) }; }
#[macro_export]
macro_rules! anyhow_Err信令{
($msg:literal $(,)?) => { Err(anyhow_err!($msg)) };
($err:expr $(,)?) => { Err(anyhow_err!($err)) };
($fmt:expr, $($arg:tt)*) => { Err(anyhow_err!($fmt, $($arg)*)) };
}
#[macro_export]
macro_rules! core发布信令任务{
($ref_信令路由:expr, $信令:expr, $enum_路径:path) => {
$信令.发布信令任务($ref_信令路由.to_owned(), |结果| match取出!(结果?, $enum_路径))
};
($ref_信令路由:expr, $信令:expr, $enum_路径:path => $($field:ident),+ ) => {
$信令.发布信令任务($ref_信令路由.to_owned(), |结果| match取出!(结果?, $enum_路径 => $($field),+ ) )
};
($ref_信令路由:expr, $信令:expr, $enum_路径:path => <$($index:tt),+> ) => {
$信令.发布信令任务($ref_信令路由.to_owned(), |结果| match取出!(结果?, $enum_路径 => <$($index),+> ) )
};
}
#[macro_export]
macro_rules! impl信令特征{
($struct_name:ident, $async_func:expr) => {
impl 信令特征 for $struct_name {
fn 动态执行函数Box(self:Box<Self>, 信令路由:信令路由, id:信令ID)-> 信令异步执行函数{
Box::pin(async move{
let 返回信令 = $async_func(信令路由, id, *self).await?;
Ok(Box::new(返回信令) as Box信令特征)
})
}
fn 动态执行函数(self, 信令路由:信令路由,id:信令ID)->信令异步执行函数{
Box::pin(async move{
let 返回信令 = $async_func(信令路由, id, self).await?;
Ok(Box::new(返回信令) as Box信令特征)
})
}
}
#[allow(dead_code)]
impl $struct_name {
fn 发布信令任务<F,T>(self,信令路由obj:信令路由, 解析信令函数:F ) -> impl 信令任务<T>
where F: FnOnce(anyhow_Result<Self>) -> anyhow_Result<T>
{
信令任务Builder::new(|本地运行bool| async move{
解析信令函数(
if 本地运行bool || 信令路由obj.inner判断无服务端(){
Box::pin($async_func(信令路由obj, 0, self)).await
}else{
信令路由obj.task发布信令_异步(self).await?.try_into()
}
)
})
}
}
impl TryFrom<Box信令特征> for $struct_name {
type Error = anyhow_Error;
fn try_from(item: Box信令特征) -> Result<Self, Self::Error> {
match (item as Box<dyn Any>).downcast::< Self >(){
Ok(val)=>{ Ok(*val) }
Err(err)=>{ Err(anyhow_err!("【Box信令特征try_from 错误】 => {err:?}")) }
}
}
}
};
}
#[macro_export]
macro_rules! match取出{
($变量:expr, $enum_路径:path ) => {
match $变量 {
$enum_路径 => Ok(()),
_ => Err(anyhow_err!("match取出!() 错误匹配 {}", stringify!($enum_路径))),
}
};
($变量:expr, $enum_路径:path => $($field:ident),+ ) => {
match $变量 {
$enum_路径 { $($field),+, .. } => Ok( ($($field),+) ),
_ => Err(anyhow_err!("match取出!() 错误匹配 {}", stringify!($enum_路径))),
}
};
($变量:expr, $enum_路径:path => <$($type_index:tt),+> ) => {
match $变量 {
$enum_路径 ($($type_index),+) => Ok( ($($type_index),+) ),
_ => Err(anyhow_err!("match取出!() 错误匹配 {}", stringify!($enum_路径))),
}
};
}
#[cfg(test)]
mod 测试{
use crate::prelude::*;
#[test]
fn test_match取出()->anyhow_Result<()>{
enum aenum {
abc,
bcd{ one:String, two:u16 },
efg(u128, String),
}
let a = aenum::abc;
let b = aenum::bcd{ one: "nihao".to_string(), two: 12 };
let c = aenum::efg( 99, "book".to_string() );
let res_a = match取出!(a, aenum::abc )?;
let res_b= match取出!(b, aenum::bcd => one, two )?;
let res_c = match取出!(c, aenum::efg => <u128, String> )?;
println!("test_match取出: {res_a:?} {res_b:?} {res_c:?}");
Ok(())
}
}
#[macro_export]
macro_rules! cfg_多行特性 {
(
#![$meta:meta]
$($item:item)*
) => {
$(
#[cfg($meta)]
$item
)*
}
}
#[macro_export]
macro_rules! cfg_if {
(
$(
if #[cfg( $i_meta:meta )] { $( $i_tokens:tt )* }
) else+
else { $( $e_tokens:tt )* }
) => {
$crate::cfg_if! {
@__items () ;
$(
(( $i_meta ) ( $( $i_tokens )* )) ,
)+
(() ( $( $e_tokens )* )) ,
}
};
(
if #[cfg( $i_meta:meta )] { $( $i_tokens:tt )* }
$(
else if #[cfg( $e_meta:meta )] { $( $e_tokens:tt )* }
)*
) => {
$crate::cfg_if! {
@__items () ;
(( $i_meta ) ( $( $i_tokens )* )) ,
$(
(( $e_meta ) ( $( $e_tokens )* )) ,
)*
}
};
(@__items ( $( $_:meta , )* ) ; ) => {};
(
@__items ( $( $no:meta , )* ) ;
(( $( $yes:meta )? ) ( $( $tokens:tt )* )) ,
$( $rest:tt , )*
) => {
#[cfg(all(
$( $yes , )?
not(any( $( $no ),* ))
))]
$crate::cfg_if! { @__identity $( $tokens )* }
$crate::cfg_if! {
@__items ( $( $no , )* $( $yes , )? ) ;
$( $rest , )*
}
};
(@__identity $( $tokens:tt )* ) => {
$( $tokens )*
};
}
#[macro_export]
macro_rules! join_path {
($($part:expr),+) => {
{
let mut p = std::path::PathBuf::new();
$(
p.push($part);
)*
p.display().to_string()
}
}
}