tm_language/der/
mod.rs

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}