
use crate::prelude::*;




#[gen_特征_derive(MOD特征_ui_dioxus)]
impl 信令路由{
    async fn exec文本信令_ui_dioxus(&self,函数名:&str, mut 参数数组:Vec<String>)-> anyhow_Result<(bool,Value,Vec<String>)>{
        let 信令路由ref = self;
        let 结果 = match 函数名{
            "ui_dioxus"  =>{
                let 标题 = if 参数数组.len() >= 1{ 参数数组.remove(0) }else{ "rust默认窗口".to_string() };
                信令路由ref.GUI_弹出主线程窗口_dioxus(标题);
                json!(true)               
            }
            _=>{ return Ok((false, json!(""), 参数数组)); }
        };
        Ok((true, 结果, Vec::new()))
    }


    fn GUI_弹出主线程窗口_dioxus(&self, 标题:impl AsRef<str>){  
        if let Some(通道数组) = self.core_chan任务流通道表().get(self.core_ref路由uuid()){
            if 通道数组.len()>=1{  通道数组[0].force_send(Box::new(信令表::弹出主线程窗口_dioxus { 标题:标题.as_ref().to_string() })).ok();    }
        }
    }
    
    fn on阻塞_主线程窗口_dioxus(&self)->anyhow_Result<()>{     //必须在主线程调用
        let (发送tx,接收rx) =  async_unbounded();
        self.core_chan任务流通道表().entry(self.core_ref路由uuid().clone())
                        .or_insert(Vec::new())
                        .push(发送tx);
        while let Ok(信令) = 接收rx.recv_blocking() { 
            match 信令.try_into(){
                Err(err)=>{   eprintln!("来自其它信令表：{err}");     }
                Ok(信令表)=>{
                    match 信令表{ 
                        信令表::弹出主线程窗口_dioxus { 标题 }=>{
                            App_弹出窗口(self.clone());
                        }
                        _=>{}
                    }
                }
            }
        }
        Ok(())
    }
}




#[derive(Clone, Serialize, Deserialize)]//可选特征
enum 信令表{
    test,
    弹出主线程窗口_dioxus{      标题:String  }, 
}
impl信令特征!(信令表, 执行函数);
async fn 执行函数(信令路由:信令路由,id:信令ID,单个信令:信令表)->anyhow_Result<信令表>{  
    return Err(anyhow_err!("无需回复"));  
}






use dioxus::prelude::*;
fn App_弹出窗口(信令路由:信令路由){
    dioxus::launch(App);
}

#[component]
fn App() -> Element {
    let mut count = use_signal(|| 0);
      
    rsx! {
        div { "Count: {count}" }
        button { onclick: move |_| count += 1, "Increment" }
        button { onclick: move |_| count -= 1, "Decrement" }
    }
}