wip: begint to accept iterator types
This commit is contained in:
1 parent
f24d29130a
commit
742f150eb3
11 files changed
+528
-143
No files matched your search
@@ -0,0 +1,131 @@
|
||||
pub fn main() {
|
||||
#[cfg(feature = "client")]
|
||||
wasm_bindgen_futures::spawn_local(async { client::app().await.unwrap() });
|
||||
|
||||
#[cfg(feature = "server")]
|
||||
async_std::task::block_on(async { server::app().await.expect("") });
|
||||
}
|
||||
|
||||
/// ===============================
|
||||
/// Common code (shared types)
|
||||
/// ===============================
|
||||
#[derive(PartialEq, strum::EnumIter, strum::Display, strum::AsRefStr, strum::EnumString)]
|
||||
pub enum SelectedStream {
|
||||
Football,
|
||||
Hockey,
|
||||
Socker,
|
||||
}
|
||||
|
||||
/// Client-specific code
|
||||
#[cfg(feature = "client")]
|
||||
mod client {
|
||||
use super::*;
|
||||
use dioxus_core::prelude::*;
|
||||
use strum::IntoEnumIterator;
|
||||
|
||||
pub async fn app() -> anyhow::Result<()> {
|
||||
Ok(dioxus_web::WebsysRenderer::start(APP).await)
|
||||
}
|
||||
|
||||
static APP: FC<()> = |ctx, props| {
|
||||
todo!()
|
||||
// let (selected_stream, set_stream) = use_state(&ctx, || SelectedStream::Football);
|
||||
|
||||
// let opts = SelectedStream::iter().map(|name| rsx! { option { "{name}", value: "{name}" } });
|
||||
|
||||
// ctx.render(rsx! {
|
||||
// div {
|
||||
// h1 { "Tide basic CRUD app" }
|
||||
// h2 { "Chosen stream: {selected_stream}" }
|
||||
// select {
|
||||
// value: {selected_stream.as_ref()}
|
||||
// "{selected_stream}"
|
||||
// {opts}
|
||||
// }
|
||||
// }
|
||||
// })
|
||||
};
|
||||
}
|
||||
|
||||
/// Server-specific code
|
||||
#[cfg(feature = "server")]
|
||||
mod server {
|
||||
use async_std::sync::RwLock;
|
||||
pub use log::info;
|
||||
use std::sync::Arc;
|
||||
use tide::Request;
|
||||
use tide_websockets::{Message, WebSocket, WebSocketConnection};
|
||||
|
||||
use crate::SelectedStream;
|
||||
|
||||
// type ServerRequest = Request<Arc<RwLock<()>>>;
|
||||
type ServerRequest = Request<()>;
|
||||
// type ServerRequest = Request<Arc<RwLock<ServerState>>>;
|
||||
|
||||
static CLIENT_PATH: &'static str = "";
|
||||
|
||||
pub async fn app() -> anyhow::Result<()> {
|
||||
let mut app = tide::new();
|
||||
|
||||
app.at("")
|
||||
.serve_dir(format!("{}/pkg", CLIENT_PATH))
|
||||
.expect("Cannot serve directory");
|
||||
|
||||
app.at("/updates").get(WebSocket::new(socket_handler));
|
||||
|
||||
let addr = "0.0.0.0:9001";
|
||||
log::info!("Congrats! Server is up and running at http://{}", addr);
|
||||
app.listen(addr).await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
async fn socket_handler(
|
||||
request: ServerRequest,
|
||||
stream: WebSocketConnection,
|
||||
) -> tide::Result<()> {
|
||||
// clone the receiver channel
|
||||
// subscribe to any updates
|
||||
// let receiver = request.state().read().await.receiver.clone();
|
||||
// while let Ok(evt) = receiver.recv().await {
|
||||
// let response_msg = serde_json::to_string(&evt)?;
|
||||
// stream.send_string(response_msg).await?;
|
||||
// }
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
use dioxus_core::prelude::*;
|
||||
|
||||
#[derive(PartialEq, Props)]
|
||||
struct SreamListProps {
|
||||
selected_stream: SelectedStream,
|
||||
}
|
||||
|
||||
static STREAM_LIST: FC<SreamListProps> = |ctx, props| {
|
||||
//
|
||||
let g = match props.selected_stream {
|
||||
SelectedStream::Football => ctx.render(rsx! {
|
||||
li {
|
||||
"watch football!"
|
||||
}
|
||||
}),
|
||||
SelectedStream::Hockey => ctx.render(rsx! {
|
||||
li {
|
||||
"watch football!"
|
||||
}
|
||||
}),
|
||||
SelectedStream::Socker => ctx.render(rsx! {
|
||||
li {
|
||||
"watch football!"
|
||||
}
|
||||
}),
|
||||
};
|
||||
|
||||
ctx.render(rsx! {
|
||||
div {
|
||||
|
||||
}
|
||||
})
|
||||
};
|
||||
}
|
||||
@@ -6,18 +6,21 @@ pub fn main() {
|
||||
async_std::task::block_on(async { server::app().await.expect("") });
|
||||
}
|
||||
|
||||
#[derive(strum::EnumIter, strum::Display, strum::AsRefStr)]
|
||||
/// ===============================
|
||||
/// Common code (shared types)
|
||||
/// ===============================
|
||||
#[derive(PartialEq, strum::EnumIter, strum::Display, strum::AsRefStr, strum::EnumString)]
|
||||
pub enum SelectedStream {
|
||||
Football,
|
||||
Hockey,
|
||||
Socker,
|
||||
}
|
||||
|
||||
/// Client-specific code
|
||||
#[cfg(feature = "client")]
|
||||
mod client {
|
||||
use super::*;
|
||||
use dioxus_core::prelude::*;
|
||||
use dioxus_web::WebsysRenderer;
|
||||
use strum::IntoEnumIterator;
|
||||
|
||||
pub async fn app() -> anyhow::Result<()> {
|
||||
@@ -25,26 +28,26 @@ mod client {
|
||||
}
|
||||
|
||||
static APP: FC<()> = |ctx, props| {
|
||||
let (selected_stream, set_stream) = use_state(&ctx, || SelectedStream::Football);
|
||||
todo!()
|
||||
// let (selected_stream, set_stream) = use_state(&ctx, || SelectedStream::Football);
|
||||
|
||||
let options = SelectedStream::iter().map(|name| {
|
||||
rsx! { option { "{name}", value: "{name}" } }
|
||||
});
|
||||
// let opts = SelectedStream::iter().map(|name| rsx! { option { "{name}", value: "{name}" } });
|
||||
|
||||
ctx.render(rsx! {
|
||||
div {
|
||||
h1 { "Tide basic CRUD app" }
|
||||
h2 { "Chosen stream: {selected_stream}" }
|
||||
select {
|
||||
value: {selected_stream.as_ref()}
|
||||
"{selected_stream}"
|
||||
{options}
|
||||
}
|
||||
}
|
||||
})
|
||||
// ctx.render(rsx! {
|
||||
// div {
|
||||
// h1 { "Tide basic CRUD app" }
|
||||
// h2 { "Chosen stream: {selected_stream}" }
|
||||
// select {
|
||||
// value: {selected_stream.as_ref()}
|
||||
// "{selected_stream}"
|
||||
// {opts}
|
||||
// }
|
||||
// }
|
||||
// })
|
||||
};
|
||||
}
|
||||
|
||||
/// Server-specific code
|
||||
#[cfg(feature = "server")]
|
||||
mod server {
|
||||
use async_std::sync::RwLock;
|
||||
@@ -53,6 +56,8 @@ mod server {
|
||||
use tide::Request;
|
||||
use tide_websockets::{Message, WebSocket, WebSocketConnection};
|
||||
|
||||
use crate::SelectedStream;
|
||||
|
||||
// type ServerRequest = Request<Arc<RwLock<()>>>;
|
||||
type ServerRequest = Request<()>;
|
||||
// type ServerRequest = Request<Arc<RwLock<ServerState>>>;
|
||||
@@ -61,11 +66,6 @@ mod server {
|
||||
|
||||
pub async fn app() -> anyhow::Result<()> {
|
||||
let mut app = tide::new();
|
||||
// let mut app = tide::with_state(Arc::new(RwLock::new(())));
|
||||
// let mut app = tide::with_state(ServerState::new());
|
||||
|
||||
// for all examples:
|
||||
// assume the bundle exists at ../public
|
||||
|
||||
app.at("")
|
||||
.serve_dir(format!("{}/pkg", CLIENT_PATH))
|
||||
@@ -94,4 +94,89 @@ mod server {
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
use dioxus_core::prelude::*;
|
||||
|
||||
#[derive(PartialEq, Props)]
|
||||
struct SreamListProps {
|
||||
selected_stream: SelectedStream,
|
||||
}
|
||||
|
||||
static STREAM_LIST: FC<SreamListProps> = |ctx, props| {
|
||||
//
|
||||
match props.selected_stream {
|
||||
SelectedStream::Football => ctx.render(rsx! {
|
||||
li {
|
||||
"watch football!"
|
||||
}
|
||||
}),
|
||||
|
||||
_ => unimplemented!()
|
||||
// .render(ctx),
|
||||
// SelectedStream::Hockey => rsx! {
|
||||
// li {
|
||||
// "watch football!"
|
||||
// }
|
||||
// }
|
||||
// .render(ctx),
|
||||
// SelectedStream::Socker => rsx! {
|
||||
// li {
|
||||
// "watch football!"
|
||||
// }
|
||||
// }
|
||||
// .render(ctx),
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
mod ergorsx {
|
||||
|
||||
// struct Ncx {}
|
||||
|
||||
// struct VVNode {}
|
||||
// struct DTree {
|
||||
// // struct DTree<F: Fn(&Ncx) -> VVNode> {
|
||||
// caller: F,
|
||||
// }
|
||||
// impl<F: Fn(&Ncx) -> VVNode> DTree<F> {
|
||||
// fn new(f: F) -> Self {
|
||||
// Self { caller: f }
|
||||
// }
|
||||
// }
|
||||
|
||||
// trait Renderable {
|
||||
// fn render(self, nodectx: &Ncx) -> VVNode;
|
||||
// }
|
||||
|
||||
// impl<F: Fn(&Ncx) -> VVNode> Renderable for DTree<F> {
|
||||
// fn render(self, nodectx: &Ncx) -> VVNode {
|
||||
// (self.caller)(nodectx)
|
||||
// }
|
||||
// }
|
||||
|
||||
// fn test() {
|
||||
// let t = 123;
|
||||
// let r = match t {
|
||||
// 123 => DTree::new(|f| VVNode {}).render(ctx),
|
||||
// 456 => DTree::new(|f| VVNode {}).render(ctx),
|
||||
// 789 => DTree::new(|f| VVNode {}).render(ctx),
|
||||
// _ => unreachable!(),
|
||||
// };
|
||||
// }
|
||||
|
||||
// fn example() {
|
||||
// rsx! {
|
||||
// div {
|
||||
|
||||
// }
|
||||
// }.render(ctx)
|
||||
// }
|
||||
|
||||
// fn example() {
|
||||
// ctx.render(rsx!{
|
||||
// div {
|
||||
|
||||
// }
|
||||
// })
|
||||
// }
|
||||
}
|
||||
Reference in new issue
Block a user