tide.rs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. pub fn main() {
  2. #[cfg(feature = "client")]
  3. wasm_bindgen_futures::spawn_local(async { client::app().await.unwrap() });
  4. #[cfg(feature = "server")]
  5. async_std::task::block_on(async { server::app().await.expect("") });
  6. }
  7. /// ===============================
  8. /// Common code (shared types)
  9. /// ===============================
  10. #[derive(PartialEq, strum::EnumIter, strum::Display, strum::AsRefStr, strum::EnumString)]
  11. pub enum SelectedStream {
  12. Football,
  13. Hockey,
  14. Socker,
  15. }
  16. /// Client-specific code
  17. #[cfg(feature = "client")]
  18. mod client {
  19. use super::*;
  20. use dioxus_core::prelude::*;
  21. use strum::IntoEnumIterator;
  22. pub async fn app() -> anyhow::Result<()> {
  23. Ok(dioxus_web::WebsysRenderer::start(APP).await)
  24. }
  25. static APP: FC<()> = |cx| {
  26. todo!()
  27. // let (selected_stream, set_stream) = use_state(&cx, || SelectedStream::Football);
  28. // let opts = SelectedStream::iter().map(|name| rsx! { option { "{name}", value: "{name}" } });
  29. // cx.render(rsx! {
  30. // div {
  31. // h1 { "Tide basic CRUD app" }
  32. // h2 { "Chosen stream: {selected_stream}" }
  33. // select {
  34. // value: {selected_stream.as_ref()}
  35. // "{selected_stream}"
  36. // {opts}
  37. // }
  38. // }
  39. // })
  40. };
  41. }
  42. /// Server-specific code
  43. #[cfg(feature = "server")]
  44. mod server {
  45. use async_std::sync::RwLock;
  46. pub use log::info;
  47. use std::sync::Arc;
  48. use tide::Request;
  49. use tide_websockets::{Message, WebSocket, WebSocketConnection};
  50. use crate::SelectedStream;
  51. // type ServerRequest = Request<Arc<RwLock<()>>>;
  52. type ServerRequest = Request<()>;
  53. // type ServerRequest = Request<Arc<RwLock<ServerState>>>;
  54. static CLIENT_PATH: &'static str = "";
  55. pub async fn app() -> anyhow::Result<()> {
  56. let mut app = tide::new();
  57. app.at("")
  58. .serve_dir(format!("{}/pkg", CLIENT_PATH))
  59. .expect("Cannot serve directory");
  60. app.at("/updates").get(WebSocket::new(socket_handler));
  61. let addr = "0.0.0.0:9001";
  62. log::info!("Congrats! Server is up and running at http://{}", addr);
  63. app.listen(addr).await?;
  64. Ok(())
  65. }
  66. async fn socket_handler(
  67. request: ServerRequest,
  68. stream: WebSocketConnection,
  69. ) -> tide::Result<()> {
  70. // clone the receiver channel
  71. // subscribe to any updates
  72. // let receiver = request.state().read().await.receiver.clone();
  73. // while let Ok(evt) = receiver.recv().await {
  74. // let response_msg = serde_json::to_string(&evt)?;
  75. // stream.send_string(response_msg).await?;
  76. // }
  77. Ok(())
  78. }
  79. use dioxus_core::prelude::*;
  80. #[derive(PartialEq, Props)]
  81. struct SreamListProps {
  82. selected_stream: SelectedStream,
  83. }
  84. static STREAM_LIST: FC<SreamListProps> = |cx| {
  85. //
  86. match cx.selected_stream {
  87. SelectedStream::Football => cx.render(rsx! {
  88. li {
  89. "watch football!"
  90. }
  91. }),
  92. _ => unimplemented!()
  93. // .render(cx),
  94. // SelectedStream::Hockey => rsx! {
  95. // li {
  96. // "watch football!"
  97. // }
  98. // }
  99. // .render(cx),
  100. // SelectedStream::Socker => rsx! {
  101. // li {
  102. // "watch football!"
  103. // }
  104. // }
  105. // .render(cx),
  106. }
  107. };
  108. }
  109. mod ergorsx {
  110. // struct Ncx {}
  111. // struct VVNode {}
  112. // struct DTree {
  113. // // struct DTree<F: Fn(&Ncx) -> VVNode> {
  114. // caller: F,
  115. // }
  116. // impl<F: Fn(&Ncx) -> VVNode> DTree<F> {
  117. // fn new(f: F) -> Self {
  118. // Self { caller: f }
  119. // }
  120. // }
  121. // trait Renderable {
  122. // fn render(self, nodecx: &Ncx) -> VVNode;
  123. // }
  124. // impl<F: Fn(&Ncx) -> VVNode> Renderable for DTree<F> {
  125. // fn render(self, nodecx: &Ncx) -> VVNode {
  126. // (self.caller)(nodecx)
  127. // }
  128. // }
  129. // fn test() {
  130. // let t = 123;
  131. // let r = match t {
  132. // 123 => DTree::new(|f| VVNode {}).render(cx),
  133. // 456 => DTree::new(|f| VVNode {}).render(cx),
  134. // 789 => DTree::new(|f| VVNode {}).render(cx),
  135. // _ => unreachable!(),
  136. // };
  137. // }
  138. // fn example() {
  139. // rsx! {
  140. // div {
  141. // }
  142. // }.render(cx)
  143. // }
  144. // fn example() {
  145. // cx.render(rsx!{
  146. // div {
  147. // }
  148. // })
  149. // }
  150. }