v / examples / js_dom_draw_benchmark_chart / chart / draw.js.v
121 lines · 93 sloc · 3.14 KB · e2e5cf8db56f3562c7baa735061690be936bdf3e
Raw
1module main
2
3import js.dom
4
5fn get_canvas(elem JS.HTMLElement) JS.HTMLCanvasElement {
6 // error: `JS.HTMLElement` doesn't implement method `getContext` of interface `JS.HTMLCanvasElement`
7 match elem {
8 JS.HTMLCanvasElement {
9 return elem
10 }
11 else {
12 JS.console.log('Not canvas')
13 return JS.HTMLCanvasElement{}
14 }
15 }
16}
17
18struct DrawState {
19mut:
20 context JS.CanvasRenderingContext2D
21 drawing bool
22 x f64
23 y f64
24}
25
26struct FrameworkPlatform {
27mut:
28 v_sqlite_memory []int
29 // v_sqlite_file []int
30 typescript_sqlite_memory []int
31}
32
33fn (mut state DrawState) draw_bench_chart(color string, time_array []int, max_time int) ? {
34 max_height := f64(480)
35 max_width := f64(720)
36
37 state.drawing = true
38 state.x = f64(0)
39 state.y = f64(max_height)
40 state.context.strokeStyle = color.str
41 state.context.lineWidth = JS.Number(1)
42
43 for i := 0; i <= time_array.len; i++ {
44 state.context.beginPath()
45 state.context.moveTo(JS.Number(state.x), JS.Number(state.y))
46 state.x = max_width / f64(time_array.len) * i + 1.0
47 state.y = max_height - (max_height / f64(max_time) * f64(time_array[i]))
48 state.context.lineTo(JS.Number(state.x), JS.Number(state.y))
49 state.context.stroke()
50 state.context.closePath()
51 }
52
53 state.drawing = false
54}
55
56fn main() {
57 document := dom.document
58
59 mut canvas_elem := map[string]JS.HTMLElement{}
60 mut canvas := map[string]JS.HTMLCanvasElement{}
61
62 canvas_elem['insert'] = document.getElementById('canvas_insert_id'.str)?
63 JS.console.log('canvas_insert_id')
64
65 canvas_elem['select'] = document.getElementById('canvas_select_id'.str)?
66 JS.console.log('canvas_select_id')
67
68 canvas_elem['update'] = document.getElementById('canvas_update_id'.str)?
69 JS.console.log('canvas_update_id')
70
71 // for orm_stmt_kind in ["insert", "select", "update"]{
72 for orm_stmt_kind in ['insert', 'select', 'update'] {
73 // type HTMLElement
74
75 canvas[orm_stmt_kind] = get_canvas(canvas_elem[orm_stmt_kind])
76
77 ctx := canvas[orm_stmt_kind].getContext('2d'.str, js_undefined())?
78
79 mut context := JS.CanvasRenderingContext2D{}
80 match ctx {
81 JS.CanvasRenderingContext2D {
82 context = ctx
83 }
84 else {
85 panic('can not get 2d context')
86 }
87 }
88
89 mut state := DrawState{context, false, 0, 0}
90
91 mut inserts_from_framework :=
92 canvas_elem[orm_stmt_kind].getAttribute('inserts_from_framework'.str)?
93
94 mut max_benchmark := canvas_elem[orm_stmt_kind].getAttribute('max_benchmark'.str)?
95
96 // -----------------------------------------------------------------------------------------------------------------------------------------------------------------
97 mut obj := FrameworkPlatform{}
98 obj = JS.JSON.parse(tos(inserts_from_framework))
99
100 // Waiting for v implement for loop getting key and value of object in v.js
101 mut attribute_int_values := []int{}
102
103 //* v framework
104 for variable in obj.v_sqlite_memory {
105 attribute_int_values << variable
106 }
107
108 state.draw_bench_chart('gray', attribute_int_values, tos(max_benchmark).int())?
109 attribute_int_values = []
110
111 //* typescript framework
112
113 for variable in obj.typescript_sqlite_memory {
114 attribute_int_values << variable
115 }
116
117 state.draw_bench_chart('red', attribute_int_values, tos(max_benchmark).int())?
118
119 attribute_int_values = []
120 }
121}
122