1use std::fmt::Formatter;
2use std::str::FromStr;
3use serde::{Deserialize, Deserializer};
4use serde::de::{Error, MapAccess, Visitor};
5use crate::{TmCaptures, TmPattern};
6
7
8#[derive(Default)]
9struct TmPatternVisitor {
10 pub name: String,
11 pub comment: String,
12 pub include: String,
13 pub begin: String,
14 pub begin_captures: TmCaptures,
15 pub end: String,
16 pub end_captures: TmCaptures,
17 pub patterns: Vec<TmPattern>,
18 pub matches: String,
19 pub captures: TmCaptures,
20}
21
22impl<'de> Deserialize<'de> for TmPattern {
23 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de> {
24 deserializer.deserialize_any(TmPatternVisitor::default())
25 }
26}
27
28impl<'de> Visitor<'de> for TmPatternVisitor {
29 type Value = TmPattern;
30
31 fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result {
32 formatter.write_str("map of index and rule")
33 }
34 fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error> where A: MapAccess<'de> {
35 let mut value = self;
36 while let Some(key) = map.next_key::<String>()? {
37 match key.as_str() {
38 "name" => value.name = map.next_value()?,
39 "comment" => value.comment = map.next_value()?,
40 "begin" => value.begin = map.next_value()?,
41 "beginCaptures" => value.begin_captures = map.next_value()?,
42 "end" => value.end = map.next_value()?,
43 "endCaptures" => value.end_captures = map.next_value()?,
44 "patterns" => value.patterns = map.next_value()?,
45 "match" => value.matches = map.next_value()?,
46 "captures" => value.captures = map.next_value()?,
47 "include" => value.include = map.next_value()?,
48 s => println!("K: {:?}", s)
49 }
50 }
51 Ok(if !value.include.is_empty() {
52 TmPattern::Include {
53 include: value.include,
54 }
55 } else {
56 TmPattern::Complete {
57 name: value.name,
58 comment: value.comment,
59 begin: value.begin,
60 begin_captures: value.begin_captures,
61 end: value.end,
62 end_captures: value.end_captures,
63 matches: value.matches,
64 captures: value.captures,
65 patterns: value.patterns,
66 }
67 })
68 }
69}
70
71impl<'de> Deserialize<'de> for TmCaptures {
72 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de> {
73 let mut out = TmCaptures::default();
74 deserializer.deserialize_any(&mut out)?;
75 Ok(out)
76 }
77 fn deserialize_in_place<D>(deserializer: D, place: &mut Self) -> Result<(), D::Error> where D: Deserializer<'de> {
78 deserializer.deserialize_any(place)
79 }
80}
81
82impl<'i, 'de> Visitor<'de> for &'i mut TmCaptures {
83 type Value = ();
84
85 fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result {
86 formatter.write_str("map of index and rule")
87 }
88 fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error> where A: MapAccess<'de> {
89 while let Some((key, value)) = map.next_entry::<String, TmPattern>()? {
90 match usize::from_str(&key) {
91 Ok(o) => {
92 self.inner.insert(o, value);
93 }
94 Err(e) => {
95 Err(A::Error::custom(e))?
96 }
97 }
98 }
99 Ok(())
100 }
101}