@@ -80,6 +80,27 @@ const FLOW_ABOUT: &str = include_str!("../../templates/flow/pages/about.rs");
8080const FLOW_MOD : & str = include_str ! ( "../../templates/flow/pages/mod.rs" ) ;
8181const FLOW_REGISTRY : & str = include_str ! ( "../../templates/flow/pages/_registry.rs" ) ;
8282
83+ const CARGO_FLOW_BOOKING : & str = r#"[package]
84+ name = "%NAME%"
85+ version = "0.1.0"
86+ edition = "2021"
87+
88+ [dependencies]
89+ resuma = "%RESUMA_VERSION%"
90+ tokio = { version = "1", features = ["full"] }
91+ serde = { version = "1", features = ["derive"] }
92+ once_cell = "1"
93+ parking_lot = "0.12"
94+ "# ;
95+
96+ const FLOW_BOOKING_MAIN : & str = include_str ! ( "../../templates/flow-booking/main.rs" ) ;
97+ const FLOW_BOOKING_STORE : & str = include_str ! ( "../../templates/flow-booking/booking_store.rs" ) ;
98+ const FLOW_BOOKING_MOD : & str = include_str ! ( "../../templates/flow-booking/pages/mod.rs" ) ;
99+ const FLOW_BOOKING_REGISTRY : & str = include_str ! ( "../../templates/flow-booking/pages/_registry.rs" ) ;
100+ const FLOW_BOOKING_INDEX : & str = include_str ! ( "../../templates/flow-booking/pages/index.rs" ) ;
101+ const FLOW_BOOKING_BOOK : & str = include_str ! ( "../../templates/flow-booking/pages/book.rs" ) ;
102+ const FLOW_BOOKING_GRACIAS : & str = include_str ! ( "../../templates/flow-booking/pages/gracias.rs" ) ;
103+
83104const CARGO_FULLSTACK : & str = r#"[package]
84105name = "%NAME%"
85106version = "0.1.0"
@@ -115,6 +136,7 @@ Created with [Resuma](https://github.com/GolfredoPerezFernandez/resuma).
115136- **todo** - full Resuma showcase (signals, server, island, security, js!)
116137- **flow** - multi-page app with `src/pages/` and FlowApp
117138- **flow-fullstack** - Flow + SQLx (SQLite) with users CRUD sample
139+ - **flow-booking** - appointments with query-driven `#[load]` + `loader_refresh_input`
118140
119141## Develop
120142
@@ -182,6 +204,30 @@ pub fn create_project(name: &str, template: &str) -> Result<()> {
182204 fs:: write ( pages. join ( "index.rs" ) , FLOW_INDEX ) . context ( "write pages/index.rs" ) ?;
183205 fs:: write ( pages. join ( "about.rs" ) , FLOW_ABOUT ) . context ( "write pages/about.rs" ) ?;
184206 }
207+ "flow-booking" => {
208+ fs:: write ( dir. join ( "Cargo.toml" ) , render_cargo ( CARGO_FLOW_BOOKING , name) )
209+ . context ( "write Cargo.toml" ) ?;
210+ fs:: write (
211+ dir. join ( "src/main.rs" ) ,
212+ FLOW_BOOKING_MAIN . replace ( "%NAME%" , name) ,
213+ )
214+ . context ( "write src/main.rs" ) ?;
215+ fs:: write ( dir. join ( "src/booking_store.rs" ) , FLOW_BOOKING_STORE )
216+ . context ( "write src/booking_store.rs" ) ?;
217+ let pages = dir. join ( "src/pages" ) ;
218+ fs:: create_dir_all ( & pages) ?;
219+ fs:: write ( pages. join ( "mod.rs" ) , FLOW_BOOKING_MOD ) . context ( "write pages/mod.rs" ) ?;
220+ fs:: write ( pages. join ( "_registry.rs" ) , FLOW_BOOKING_REGISTRY )
221+ . context ( "write pages/_registry.rs" ) ?;
222+ fs:: write ( pages. join ( "index.rs" ) , FLOW_BOOKING_INDEX . replace ( "%NAME%" , name) )
223+ . context ( "write pages/index.rs" ) ?;
224+ fs:: write ( pages. join ( "book.rs" ) , FLOW_BOOKING_BOOK ) . context ( "write pages/book.rs" ) ?;
225+ fs:: write ( pages. join ( "gracias.rs" ) , FLOW_BOOKING_GRACIAS )
226+ . context ( "write pages/gracias.rs" ) ?;
227+ let public = dir. join ( "public" ) ;
228+ fs:: create_dir_all ( & public) ?;
229+ fs:: write ( public. join ( ".gitkeep" ) , "" ) . ok ( ) ;
230+ }
185231 "flow-fullstack" => {
186232 fs:: write ( dir. join ( "Cargo.toml" ) , render_cargo ( CARGO_FULLSTACK , name) )
187233 . context ( "write Cargo.toml" ) ?;
@@ -205,7 +251,7 @@ pub fn create_project(name: &str, template: &str) -> Result<()> {
205251 }
206252 other => {
207253 return Err ( anyhow ! (
208- "unknown template `{}` (try: basic, todo, flow, flow-fullstack)" ,
254+ "unknown template `{}` (try: basic, todo, flow, flow-booking, flow- fullstack)" ,
209255 other
210256 ) ) ;
211257 }
@@ -230,7 +276,13 @@ mod tests {
230276
231277 #[ test]
232278 fn cargo_templates_pin_the_cli_crate_version ( ) {
233- for cargo_template in [ CARGO_BASIC , CARGO_TODO , CARGO_FLOW , CARGO_FULLSTACK ] {
279+ for cargo_template in [
280+ CARGO_BASIC ,
281+ CARGO_TODO ,
282+ CARGO_FLOW ,
283+ CARGO_FLOW_BOOKING ,
284+ CARGO_FULLSTACK ,
285+ ] {
234286 let rendered = render_cargo ( cargo_template, "smoke-app" ) ;
235287 assert ! ( rendered. contains( "name = \" smoke-app\" " ) ) ;
236288 assert ! ( rendered. contains( & format!( "\" {}\" " , env!( "CARGO_PKG_VERSION" ) ) ) ) ;
0 commit comments