rive_rs/core/
property.rs
1use std::cell::Cell;
6use std::fmt;
7
8use crate::core::BinaryReader;
9use crate::shapes::paint::Color32;
10
11#[derive(Default)]
12pub struct Property<T> {
13 cell: Cell<T>,
14}
15
16impl<T: Clone + Default> Property<T> {
17 pub fn new(val: T) -> Self {
18 Self { cell: Cell::new(val) }
19 }
20
21 pub fn get(&self) -> T {
22 let val = self.cell.take();
23 self.cell.set(val.clone());
24 val
25 }
26
27 pub fn set(&self, val: T) {
28 self.cell.set(val);
29 }
30}
31
32impl<T: Clone + fmt::Debug + Default> fmt::Debug for Property<T> {
33 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
34 f.debug_struct("Property").field("value", &self.get()).finish()
35 }
36}
37
38pub trait TryFromU64: Sized {
39 fn try_from(val: u64) -> Option<Self>;
40}
41
42pub trait Writable {
43 fn write(&self, reader: &mut BinaryReader<'_>) -> Option<()>;
44}
45
46impl Writable for Property<bool> {
47 fn write(&self, reader: &mut BinaryReader<'_>) -> Option<()> {
48 self.set(reader.read_u8()? != 0);
49 Some(())
50 }
51}
52
53impl Writable for Property<u32> {
54 fn write(&self, reader: &mut BinaryReader<'_>) -> Option<()> {
55 self.set(reader.read_u32()?);
56 Some(())
57 }
58}
59
60impl Writable for Property<u64> {
61 fn write(&self, reader: &mut BinaryReader<'_>) -> Option<()> {
62 self.set(reader.read_var_u64()?);
63 Some(())
64 }
65}
66
67impl Writable for Property<f32> {
68 fn write(&self, reader: &mut BinaryReader<'_>) -> Option<()> {
69 self.set(reader.read_f32()?);
70 Some(())
71 }
72}
73
74impl Writable for Property<Color32> {
75 fn write(&self, reader: &mut BinaryReader<'_>) -> Option<()> {
76 self.set(reader.read_u32()?.into());
77 Some(())
78 }
79}
80
81impl Writable for Property<String> {
82 fn write(&self, reader: &mut BinaryReader<'_>) -> Option<()> {
83 self.set(reader.read_string()?);
84 Some(())
85 }
86}
87
88impl<T: TryFromU64 + Clone + Default> Writable for Property<T> {
89 fn write(&self, reader: &mut BinaryReader<'_>) -> Option<()> {
90 self.set(TryFromU64::try_from(reader.read_var_u64()?)?);
91 Some(())
92 }
93}