1use js_sys::{Array, Function, Object};
2use wasm_bindgen::prelude::*;
3
4#[wasm_bindgen]
5extern "C" {
6
7    #[wasm_bindgen(extends = Object, js_name = d3)]
8    pub type D3;
9
10    #[wasm_bindgen(static_method_of=D3, js_class=d3, js_name = scaleTime)]
19    pub fn scale_time() -> ScaleTime;
20
21    #[wasm_bindgen(static_method_of=D3, js_class=d3, js_name = scaleLinear)]
22    pub fn scale_linear() -> ScaleLinear;
23
24    #[wasm_bindgen(static_method_of=D3, js_class=d3, js_name = area)]
25    pub fn area() -> Area;
26
27    #[wasm_bindgen(static_method_of=D3, js_class=d3, js_name = extent)]
28    pub fn extent(data: &Array, cb: Function) -> Array;
29}
30
31#[wasm_bindgen]
32extern "C" {
33    #[wasm_bindgen(extends = Function)]
34    pub type ScaleTime;
35
36    #[wasm_bindgen(method, js_name=range)]
37    pub fn range_impl(this: &ScaleTime, range: Array) -> ScaleTime;
38
39    #[wasm_bindgen(method, js_name=domain)]
40    pub fn set_domain_array(this: &ScaleTime, domain: Array) -> ScaleTime;
41
42    #[wasm_bindgen(method)]
43    pub fn ticks(this: &ScaleTime, count: u32) -> Array;
44
45    #[wasm_bindgen(method, js_name=tickFormat)]
46    pub fn tick_format(this: &ScaleTime) -> Function;
47
48    #[wasm_bindgen(method, js_name=clamp)]
49    pub fn set_clamp(this: &ScaleTime, clamp: bool);
50
51    }
55
56impl ScaleTime {
57    pub fn range(&self, range: [f32; 2]) -> &Self {
58        let range_value = Array::new();
59        range_value.push(&range[0].into());
60        range_value.push(&range[1].into());
61        self.range_impl(range_value);
62        self
63    }
64}
65
66#[wasm_bindgen]
67extern "C" {
68    #[wasm_bindgen(extends = Function)]
69    pub type ScaleLinear;
70
71    #[wasm_bindgen(method, js_name=range)]
72    pub fn range_impl(this: &ScaleLinear, range: Array) -> ScaleLinear;
73
74    #[wasm_bindgen(method, js_name=domain)]
75    pub fn set_domain_array(this: &ScaleLinear, domain: Array) -> ScaleLinear;
76
77    #[wasm_bindgen(method)]
78    pub fn ticks(this: &ScaleLinear, count: u32) -> Array;
79
80    #[wasm_bindgen(method, js_name=tickFormat)]
81    pub fn tick_format(this: &ScaleLinear) -> Function;
82}
83
84impl ScaleLinear {
85    pub fn range(&self, range: [f32; 2]) -> &Self {
86        let range_value = Array::new();
87        range_value.push(&range[0].into());
88        range_value.push(&range[1].into());
89        self.range_impl(range_value);
90        self
91    }
92
93    pub fn set_domain(&self, min: u32, max: u32) -> &Self {
94        let domain = Array::new();
95        domain.push(&min.into());
96        domain.push(&max.into());
97        self.set_domain_array(domain);
98        self
99    }
100}
101
102#[wasm_bindgen]
103extern "C" {
104    #[wasm_bindgen(extends = Function)]
105    pub type Area;
106
107    #[wasm_bindgen(method)]
108    pub fn x(this: &Area, cb: &Function) -> Area;
109
110    #[wasm_bindgen(method)]
111    pub fn y0(this: &Area, value: f32) -> Area;
112
113    #[wasm_bindgen(method)]
114    pub fn y1(this: &Area, cb: &Function) -> Area;
115
116    #[wasm_bindgen(method)]
117    pub fn context(this: &Area, ctx: &web_sys::CanvasRenderingContext2d) -> Area;
118}