rive_rs/core/
property.rs

1// Copyright 2021 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use 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}