clap_serde/de/
group.rs

1use crate::ArgGroupWrap;
2use clap::{ArgGroup, Command};
3use serde::de::{DeserializeSeed, Error, Visitor};
4
5struct GroupVisitor<'a>(&'a str);
6
7impl<'de> Visitor<'de> for GroupVisitor<'de> {
8    type Value = ArgGroupWrap<'de>;
9
10    fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
11        formatter.write_str("arg group map")
12    }
13
14    fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
15    where
16        A: serde::de::MapAccess<'de>,
17    {
18        let mut group = ArgGroup::new(self.0);
19        while let Some(key) = map.next_key::<&str>()? {
20            group = parse_value!(key, group, map, ArgGroup, {
21                (arg, &str),
22                ref (args, Vec<&str>),
23                (conflicts_with, &str),
24                ref (conflicts_with_all, Vec<&str>),
25                (id, &str),
26                (multiple, bool),
27                (required, bool),
28                (requires, &str),
29                ref (requires_all, Vec<&str>),
30            }, deprecated:{
31                "name" => "id",
32            });
33        }
34
35        Ok(ArgGroupWrap { group })
36    }
37}
38
39impl<'de> DeserializeSeed<'de> for GroupVisitor<'de> {
40    type Value = ArgGroupWrap<'de>;
41
42    fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
43    where
44        D: serde::Deserializer<'de>,
45    {
46        deserializer.deserialize_map(self)
47    }
48}
49
50pub(crate) struct Groups<'a>(pub(crate) Command<'a>);
51impl<'de> DeserializeSeed<'de> for Groups<'de> {
52    type Value = Command<'de>;
53
54    fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
55    where
56        D: serde::Deserializer<'de>,
57    {
58        deserializer.deserialize_map(self)
59    }
60}
61
62impl<'de> Visitor<'de> for Groups<'de> {
63    type Value = Command<'de>;
64
65    fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
66        formatter.write_str("arg groups")
67    }
68
69    fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
70    where
71        A: serde::de::MapAccess<'de>,
72    {
73        let mut app = self.0;
74        while let Some(name) = map.next_key::<&str>()? {
75            app = app.group(map.next_value_seed(GroupVisitor(name))?);
76        }
77        Ok(app)
78    }
79}