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}