tf_bindgen/value/
cell.rs

1use std::ops::{Deref, Index};
2
3use serde::{Serialize, Serializer};
4
5use super::prepare::Prepare;
6
7/// Used to store field information and value.
8#[derive(Clone)]
9pub struct Cell<T> {
10    path: String,
11    value: T,
12}
13
14impl<T> Cell<T> {
15    /// Creates a new cell using `name` as field name and value as content.
16    pub fn new(name: impl Into<String>, value: impl Into<T>) -> Self {
17        Self {
18            path: name.into(),
19            value: value.into(),
20        }
21    }
22
23    pub fn path(&self) -> &str {
24        &self.path
25    }
26
27    pub fn value(&self) -> &T {
28        &self.value
29    }
30}
31
32impl<T> Index<usize> for Cell<Option<Vec<T>>> {
33    type Output = T;
34
35    fn index(&self, index: usize) -> &Self::Output {
36        match &self.value {
37            Some(arr) => &arr[index],
38            None => panic!("cannot index empty array"),
39        }
40    }
41}
42
43impl<T: Prepare + Clone> Prepare for Cell<T> {
44    fn prepare(self, prefix: impl Into<String>) -> Self {
45        let path = prefix.into();
46        let value = self.value.prepare(&path);
47        Self { path, value }
48    }
49}
50
51impl<T> Deref for Cell<T> {
52    type Target = T;
53
54    fn deref(&self) -> &Self::Target {
55        &self.value
56    }
57}
58
59impl<T: Serialize> Serialize for Cell<T> {
60    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
61    where
62        S: Serializer,
63    {
64        self.value.serialize(serializer)
65    }
66}