wrend/buffers/
buffer_link.rs

1use super::buffer_create_context::BufferCreateContext;
2use crate::{BufferCreateCallback, Id};
3use std::fmt::Debug;
4use std::hash::Hash;
5use web_sys::{WebGl2RenderingContext, WebGlBuffer};
6
7#[derive(Clone)]
8pub struct BufferLink<BufferId: Id> {
9    buffer_id: BufferId,
10    buffer_create_callback: BufferCreateCallback,
11}
12
13impl<BufferId: Id> BufferLink<BufferId> {
14    pub fn new(
15        buffer_id: impl Into<BufferId>,
16        buffer_create_callback: impl Into<BufferCreateCallback>,
17    ) -> Self {
18        Self {
19            buffer_id: buffer_id.into(),
20            buffer_create_callback: buffer_create_callback.into(),
21        }
22    }
23
24    pub fn buffer_id(&self) -> &BufferId {
25        &self.buffer_id
26    }
27
28    pub fn create_buffer(&self, gl: WebGl2RenderingContext, now: f64) -> WebGlBuffer {
29        let buffer_create_context = BufferCreateContext::new(gl, now);
30        self.buffer_create_callback
31            .call_with_into_js_arg_and_return(&buffer_create_context)
32    }
33}
34
35impl<BufferId: Id> Debug for BufferLink<BufferId> {
36    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
37        f.debug_struct("BufferLink")
38            .field("buffer_id", &self.buffer_id)
39            .finish()
40    }
41}
42
43impl<BufferId: Id> Hash for BufferLink<BufferId> {
44    fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
45        self.buffer_id.hash(state);
46    }
47}
48
49impl<BufferId: Id> PartialEq for BufferLink<BufferId> {
50    fn eq(&self, other: &Self) -> bool {
51        self.buffer_id == other.buffer_id
52    }
53}
54
55impl<BufferId: Id> Eq for BufferLink<BufferId> {}