1use serde::{
2 de::{
3 self,
4 IntoDeserializer
5 },
6 Deserialize,
7 Deserializer,
8 Serialize,
9 Serializer
10};
11use std::{
12 clone::Clone,
13 convert::From,
14 fmt,
15 marker::PhantomData,
16 vec::Vec
17};
18
19#[derive(Clone, Debug, PartialEq)]
20pub struct Script<I: Clone>(Vec<I>);
21
22impl<I: Clone> Script<I> {
23 pub fn new() -> Self {
24 Script(vec![])
25 }
26
27 pub fn get(&self, l: usize) -> Option<I> {
28 if let Some(i) = self.0.get(l) {
29 return Some(i.clone());
30 }
31 None
32 }
33}
34
35impl<I: Clone> From<Vec<I>> for Script<I> {
36 fn from(s: Vec<I>) -> Self {
37 Script(s)
38 }
39}
40
41impl<I: Clone + fmt::Display> fmt::Display for Script<I> {
42 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
43 for (n, i) in self.0.iter().enumerate() {
44 if n > 0 {
45 write!(f, " ").unwrap();
46 }
47 write!(f, "{}", i).unwrap();
48 }
49 Ok(())
50 }
51}
52
53impl<I: Clone + fmt::Display> Serialize for Script<I> {
54 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error>
55 {
56 s.serialize_str(format!("{}", self).as_str())
57 }
58}
59
60struct ScriptVisitor<I>(PhantomData<fn() -> I>);
61
62impl<'de, I: Clone + Deserialize<'de> + fmt::Debug> de::Visitor<'de> for ScriptVisitor<I> {
63 type Value = Script<I>;
64
65 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
66 write!(f, "Script string")
67 }
68
69 fn visit_str<E: de::Error>(self, s: &str) -> Result<Self::Value, E> {
70
71 let mut v: Vec<I> = Vec::new();
72 for t in s.split_whitespace() {
73 let i: I = Deserialize::deserialize(t.into_deserializer())?;
74 v.push(i);
75 }
76 Ok(Script::from(v))
77 }
78}
79
80impl<'de, I: Clone + Deserialize<'de> + fmt::Debug> Deserialize<'de> for Script<I> {
81 fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Script<I>, D::Error>
82 {
83 d.deserialize_str(ScriptVisitor(PhantomData))
84 }
85}
86