1use std::ops::{Deref, Index};
2
3use serde::{Serialize, Serializer};
4
5use super::prepare::Prepare;
6
7#[derive(Clone)]
9pub struct Cell<T> {
10 path: String,
11 value: T,
12}
13
14impl<T> Cell<T> {
15 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}