Skip to content

Commit 5ff034e

Browse files
authored
Merge pull request #1 from Softgod4/test
merge two branches
2 parents 920e8d5 + 1f4d13a commit 5ff034e

File tree

13 files changed

+281
-192
lines changed

13 files changed

+281
-192
lines changed

index.html

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,17 @@
1414
<article class="header flex flex-col">
1515
<h1>Rust 🦀 and WebAssembly 🕸</h1>
1616
<div class="actions flex flex-row">
17-
<p>Todo by Softgod 📝</p>
17+
<p class="text-center">Todo by Softgod 📝</p>
1818
</div>
1919
</article>
20-
<div class="todo">
21-
<div id="rust-logo">
20+
<div class="todo flex flex-col justify-center align-start">
21+
<div id="rust-logo" class="w-100 flex justify-center align-center">
2222
<img src="/image/rust-logo.png" alt="rust-logo">
2323
</div>
24-
<div class="tasks">
24+
<div class="tasks w-100">
2525
<article class="tasks-engine flex justify-between align-center">
26-
<h2>Tasks</h2>
27-
<button id="remove-all">Remove first task</button>
26+
<h2 class="text-start">Tasks</h2>
27+
<button class="text-start" id="remove-all">Remove first task</button>
2828
</article>
2929
<div class="tasks-list">
3030
<label class="tasks-list__item">
@@ -67,15 +67,15 @@ <h2>Tasks</h2>
6767
</div>
6868
<div class="add-task flex justify-start align-center">
6969
<input type="text" placeholder="todo name" id="input-task">
70-
<button id="add-task">Add task</button>
70+
<button id="add-task" class="w-100">Add task</button>
7171
</div>
7272
</div>
7373
</div>
7474
</body>
7575
<script type="module">
76-
import init, { greet } from "./pkg/hello_wasm.js";
76+
import init, { run } from "./pkg/hello_wasm.js";
7777
await init();
78-
greet();
78+
run();
7979
</script>
8080

8181
</html>

src/closure.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// in the future such event listener implementation will be added
2+
3+
use wasm_bindgen::prelude::*;
4+
use web_sys::{ HtmlElement, HtmlInputElement };
5+
6+
use crate::{ dom, input, tasks };
7+
8+
pub(crate) struct EventListener {}
9+
10+
impl EventListener {
11+
pub fn get_input_value() {
12+
let _clos: Closure<dyn FnMut(HtmlElement)> = Closure::<
13+
dyn FnMut(_)
14+
>::new(move |_: web_sys::HtmlElement| {
15+
let input_value: String = dom::Dom
16+
::get_doc()
17+
.get_element_by_id("input-task")
18+
.unwrap()
19+
.dyn_into::<HtmlInputElement>()
20+
.unwrap()
21+
.value();
22+
23+
if !input::Method::value_test(input_value.clone()) {
24+
let _ = tasks::Method::create_task(input_value.clone());
25+
} else {
26+
let _ = input::Method::not_valide();
27+
}
28+
});
29+
30+
_clos.forget();
31+
}
32+
33+
pub fn delete_value() {
34+
let _clos: Closure<dyn FnMut(HtmlElement)> = Closure::<
35+
dyn FnMut(_)
36+
>::new(move |_: web_sys::HtmlElement| {
37+
let _ = tasks::Method::delete_task();
38+
});
39+
40+
_clos.forget();
41+
}
42+
}

src/dom.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
use web_sys::{Document, HtmlElement};
2+
3+
pub(crate) struct Dom {}
4+
5+
impl Dom {
6+
pub fn get_doc() -> Document {
7+
let window = web_sys::window().expect("no global `window` exists");
8+
let document = window
9+
.document()
10+
.expect("should have a document on window");
11+
return document;
12+
}
13+
14+
pub fn get_body() -> HtmlElement {
15+
let body: web_sys::HtmlElement = Dom::get_doc().body().expect("document dsnt have a body");
16+
body
17+
}
18+
}
19+
20+
// let body: HtmlElement = dom
21+
// ::doc()
22+
// .body()
23+
// .expect("document should have a body");

src/input.rs

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
use once_cell::sync::Lazy;
2+
use regex::Regex;
3+
use wasm_bindgen::JsValue;
4+
use web_sys::Element;
5+
use crate::log;
6+
7+
use crate::{ dom, r#macro };
8+
9+
pub(crate) struct Method {
10+
input_value: String,
11+
}
12+
13+
impl Method {
14+
pub fn new(input_value: String) -> Method {
15+
Method { input_value }
16+
}
17+
18+
pub fn value_test(input_value: String) -> bool {
19+
let copy_value: String = input_value.to_string();
20+
static RE: Lazy<Regex> = Lazy::new(||
21+
Regex::new(r"(^$|[^a-zA-Z\s])").unwrap()
22+
);
23+
RE.is_match(&copy_value)
24+
}
25+
26+
pub fn not_valide() -> Result<(), JsValue> {
27+
let not_valide_message: web_sys::Element = dom::Dom
28+
::get_body()
29+
.query_selector(".todo")
30+
.unwrap()
31+
.expect("");
32+
33+
match dom::Dom::get_body().query_selector(".not-valid") {
34+
Ok(Some(_)) => {}
35+
Ok(None) => {
36+
r#macro::log!("not exists");
37+
let val: Element = dom::Dom::get_doc().create_element("p")?;
38+
val.set_text_content(Some("Not valide input!"));
39+
val.set_class_name("not-valid");
40+
not_valide_message.append_child(&val)?;
41+
}
42+
Err(e) => {
43+
r#macro::log!("{:?}", e);
44+
}
45+
}
46+
Ok(())
47+
}
48+
49+
pub fn delete_not_valide() -> Result<(), JsValue> {
50+
match dom::Dom::get_body().query_selector(".not-valid") {
51+
Ok(Some(_)) => {
52+
let valid = dom::Dom
53+
::get_body()
54+
.query_selector(".not-valid")
55+
.unwrap()
56+
.expect("");
57+
valid.remove();
58+
}
59+
Ok(None) => {
60+
r#macro::log!("not exists");
61+
}
62+
Err(e) => {
63+
r#macro::log!("{:?}", e);
64+
}
65+
}
66+
Ok(())
67+
}
68+
}

src/lib.rs

Lines changed: 17 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
mod utils;
22
mod 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;
69
use wasm_bindgen::prelude::*;
7-
use web_sys::{ Document, Element, HtmlElement, HtmlInputElement };
10+
use web_sys::{ HtmlElement, HtmlInputElement };
811

912
#[wasm_bindgen]
1013
extern "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
}

src/macro.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
macro_rules! log {
2+
($($t:tt)*) => (log(&format_args!($($t)*).to_string()));
3+
}
4+
5+
pub(crate) use log;

0 commit comments

Comments
 (0)