11mod utils;
22mod task_inner;
3+ mod tasks;
4+ pub mod r#macro;
5+ pub mod dom;
6+ pub mod input;
7+ mod closure;
38
4- use once_cell:: sync:: Lazy ;
5- use regex:: Regex ;
69use wasm_bindgen:: prelude:: * ;
7- use web_sys:: { Document , Element , HtmlElement , HtmlInputElement } ;
10+ use web_sys:: { HtmlElement , HtmlInputElement } ;
811
912#[ wasm_bindgen]
1013extern "C" {
@@ -13,140 +16,47 @@ extern "C" {
1316 fn log ( s : & str ) ;
1417}
1518
16- macro_rules! console_log {
17- ( $( $t: tt) * ) => ( log( & format_args!( $( $t) * ) . to_string( ) ) ) ;
18- }
19-
20- fn dcmnt ( ) -> Document {
21- let window = web_sys:: window ( ) . expect ( "no global `window` exists" ) ;
22- let document = window. document ( ) . expect ( "should have a document on window" ) ;
23- return document;
24- }
25-
26- fn value_test ( str : String ) -> bool {
27- static RE : Lazy < Regex > = Lazy :: new ( ||
28- Regex :: new ( r"(^$|[^a-zA-Z\s])" ) . unwrap ( )
29- ) ;
30- RE . is_match ( & str)
31- }
32-
33- // create a new task in todo (onclick button)
34- #[ wasm_bindgen]
35- pub fn create_task ( task_name : String ) -> Result < ( ) , JsValue > {
36- let render: Document = dcmnt ( ) ;
37- let body: HtmlElement = render. body ( ) . expect ( "document should have a body" ) ;
38- let _ = delete_not_valide ( ) ;
39- let tasks_list: web_sys:: Element = body
40- . query_selector ( ".tasks-list" )
41- . unwrap ( )
42- . expect ( "" ) ;
43-
44- let task = render. create_element ( "label" ) ?;
45- task. set_class_name ( "tasks-list__item" ) ;
46- task. set_inner_html ( & task_inner:: get_inner ( task_name) ) ;
47- tasks_list. append_child ( & task) ?;
48- Ok ( ( ) )
49- }
50-
51- #[ wasm_bindgen]
52- pub fn delete_task ( ) -> Result < ( ) , JsError > {
53- let item = dcmnt ( )
54- . query_selector ( ".tasks-list__item" )
55- . map_err ( |_| JsError :: new ( "Query selector failed" ) ) ?
56- . ok_or_else ( || JsError :: new ( "No tasks found" ) ) ?;
57-
58- item. remove ( ) ;
59-
60- Ok ( ( ) )
61- }
62-
63- // not valide input
64- #[ wasm_bindgen]
65- pub fn not_valide ( ) -> Result < ( ) , JsValue > {
66- let render: Document = dcmnt ( ) ;
67- let body: HtmlElement = render. body ( ) . expect ( "document should have a body" ) ;
68- let not_valide_message: web_sys:: Element = body
69- . query_selector ( ".todo" )
70- . unwrap ( )
71- . expect ( "" ) ;
72-
73- match body. query_selector ( ".not-valid" ) {
74- Ok ( Some ( _) ) => { }
75- Ok ( None ) => {
76- console_log ! ( "not exists" ) ;
77- let val: Element = render. create_element ( "p" ) ?;
78- val. set_text_content ( Some ( "Not valide input!" ) ) ;
79- val. set_class_name ( "not-valid" ) ;
80- not_valide_message. append_child ( & val) ?;
81- }
82- Err ( e) => {
83- console_log ! ( "{:?}" , e) ;
84- }
85- }
86- Ok ( ( ) )
87- }
88-
89- // for delete not valide input
90- #[ wasm_bindgen]
91- pub fn delete_not_valide ( ) -> Result < ( ) , JsValue > {
92- let render: Document = dcmnt ( ) ;
93- let body: HtmlElement = render. body ( ) . expect ( "document should have a body" ) ;
94- match body. query_selector ( ".not-valid" ) {
95- Ok ( Some ( _) ) => {
96- let valid = body. query_selector ( ".not-valid" ) . unwrap ( ) . expect ( "" ) ;
97- valid. remove ( ) ;
98- }
99- Ok ( None ) => {
100- console_log ! ( "not exists" ) ;
101- }
102- Err ( e) => {
103- console_log ! ( "{:?}" , e) ;
104- }
105- }
106- Ok ( ( ) )
107- }
108-
10919// main function
11020#[ wasm_bindgen]
111- pub fn greet ( ) -> Result < ( ) , JsValue > {
112- let render: Document = dcmnt ( ) ;
113-
21+ pub fn run ( ) -> Result < ( ) , JsValue > {
11422 // event-listener
11523 let add_closure: Closure < dyn FnMut ( HtmlElement ) > = Closure :: <
11624 dyn FnMut ( _)
11725 > :: new ( move |_: web_sys:: HtmlElement | {
118- let input_value: String = dcmnt ( )
26+ let input_value: String = dom:: Dom
27+ :: get_doc ( )
11928 . get_element_by_id ( "input-task" )
12029 . unwrap ( )
12130 . dyn_into :: < HtmlInputElement > ( )
12231 . unwrap ( )
12332 . value ( ) ;
12433
125- if !value_test ( input_value. clone ( ) ) {
126- console_log ! ( "{}" , input_value) ;
127- let _ = create_task ( input_value) ;
34+ if !input:: Method :: value_test ( input_value. clone ( ) ) {
35+ let _ = tasks:: Method :: create_task ( input_value. clone ( ) ) ;
12836 } else {
129- let _ = not_valide ( ) ;
37+ let _ = input :: Method :: not_valide ( ) ;
13038 }
13139 } ) ;
13240
13341 // event-listener
13442 let delete_closure: Closure < dyn FnMut ( HtmlElement ) > = Closure :: <
13543 dyn FnMut ( _)
13644 > :: new ( move |_: web_sys:: HtmlElement | {
137- let _ = delete_task ( ) ;
45+ let _ = tasks :: Method :: delete_task ( ) ;
13846 } ) ;
13947
14048 // buttons
141- let _button: Result < ( ) , JsValue > = render
49+ let _button: Result < ( ) , JsValue > = dom:: Dom
50+ :: get_doc ( )
14251 . get_element_by_id ( "add-task" )
14352 . unwrap ( )
14453 . add_event_listener_with_callback (
14554 "click" ,
14655 add_closure. as_ref ( ) . unchecked_ref ( )
14756 ) ;
14857
149- let _delete_btn: Result < ( ) , JsValue > = render
58+ let _delete_btn: Result < ( ) , JsValue > = dom:: Dom
59+ :: get_doc ( )
15060 . get_element_by_id ( "remove-all" )
15161 . unwrap ( )
15262 . add_event_listener_with_callback (
@@ -156,14 +66,5 @@ pub fn greet() -> Result<(), JsValue> {
15666
15767 add_closure. forget ( ) ;
15868 delete_closure. forget ( ) ;
159-
160- // testing
161- // let i: u32 = 1;
162- // for _n in i..5 {
163- // let val: Element = render.create_element("p")?;
164- // val.set_text_content(Some("abc"));
165- // container.append_child(&val)?;
166- // }
167-
16869 Ok ( ( ) )
16970}
0 commit comments