@@ -2,12 +2,21 @@ use serde::de::{DeserializeSeed, Error as DeError, MapAccess, SeqAccess, Visitor
2
2
use serde:: { Deserialize , Deserializer } ;
3
3
use std:: collections:: HashMap ;
4
4
use std:: fmt:: Formatter ;
5
+ use std:: ops:: Deref ;
5
6
use std:: str:: FromStr ;
6
7
use std:: sync:: Arc ;
7
- use trust_dns_server:: proto:: rr:: { Name , RecordSet , RecordType } ;
8
+ use trust_dns_server:: proto:: rr:: { Name , RecordSet , RecordType , RData } ;
8
9
9
- #[ derive( Default ) ]
10
- struct PreconfiguredRecords ( HashMap < Name , HashMap < & str , Arc < RecordSet > > > ) ;
10
+ #[ derive( Debug , Default ) ]
11
+ pub struct PreconfiguredRecords ( HashMap < Name , HashMap < RecordType , Arc < RecordSet > > > ) ;
12
+
13
+ impl Deref for PreconfiguredRecords {
14
+ type Target = HashMap < Name , HashMap < RecordType , Arc < RecordSet > > > ;
15
+
16
+ fn deref ( & self ) -> & Self :: Target {
17
+ & self . 0
18
+ }
19
+ }
11
20
12
21
impl < ' de > Deserialize < ' de > for PreconfiguredRecords {
13
22
fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
@@ -50,40 +59,85 @@ impl<'de> Deserialize<'de> for PreconfiguredRecords {
50
59
struct RecordDataSeed ( Name ) ;
51
60
52
61
impl < ' de > DeserializeSeed < ' de > for RecordDataSeed {
53
- type Value = ( RecordType , Arc < RecordSet > ) ;
62
+ type Value = ( Name , HashMap < RecordType , Arc < RecordSet > > ) ;
54
63
55
64
fn deserialize < D > ( self , deserializer : D ) -> Result < Self :: Value , D :: Error >
56
65
where
57
66
D : Deserializer < ' de > ,
58
67
{
59
68
struct RecordDataVisitor ( Name ) ;
60
69
impl < ' de > Visitor < ' de > for RecordDataVisitor {
61
- type Value = ( RecordType , Arc < RecordSet > ) ;
70
+ type Value = ( Name , HashMap < RecordType , Arc < RecordSet > > ) ;
62
71
63
72
fn expecting ( & self , formatter : & mut Formatter ) -> std:: fmt:: Result {
64
73
formatter. write_str ( "RecordData" )
65
74
}
66
75
76
+ fn visit_map < A > ( self , mut map : A ) -> Result < Self :: Value , A :: Error >
77
+ where
78
+ A : MapAccess < ' de > ,
79
+ {
80
+ let name = self . 0 ;
81
+ let mut res = HashMap :: new ( ) ;
82
+ while let Some ( record_type) = map. next_key :: < & str > ( ) ? {
83
+ let record_type = match record_type {
84
+ "TXT" => RecordType :: TXT ,
85
+ "A" => RecordType :: A ,
86
+ "CNAME" => RecordType :: CNAME ,
87
+ _ => return Err ( DeError :: custom ( "Could not find RecordType" ) ) ,
88
+ } ;
89
+
90
+ let record_set = map. next_value_seed ( RecordSeed ( name. clone ( ) , record_type) ) ?;
91
+
92
+ res. insert ( record_type, record_set) ;
93
+ }
94
+
95
+ Ok ( ( name, res) )
96
+ }
97
+ }
98
+
99
+ deserializer. deserialize_map ( RecordDataVisitor ( self . 0 ) )
100
+ }
101
+ }
102
+
103
+ struct RecordSeed ( Name , RecordType ) ;
104
+
105
+ impl < ' de > DeserializeSeed < ' de > for RecordSeed {
106
+ type Value = Arc < RecordSet > ;
107
+
108
+ fn deserialize < D > ( self , deserializer : D ) -> Result < Self :: Value , D :: Error >
109
+ where
110
+ D : Deserializer < ' de > ,
111
+ {
112
+ struct RecordVisitor ( Name , RecordType ) ;
113
+ impl < ' de > Visitor < ' de > for RecordVisitor {
114
+ type Value = Arc < RecordSet > ;
115
+
116
+ fn expecting ( & self , formatter : & mut Formatter ) -> std:: fmt:: Result {
117
+ formatter. write_str ( "Record" )
118
+ }
119
+
67
120
fn visit_seq < A > ( self , mut seq : A ) -> Result < Self :: Value , A :: Error >
68
121
where
69
122
A : SeqAccess < ' de > ,
70
123
{
71
- let record_type = match seq. next_element :: < & str > ( ) ? {
72
- Some ( record_type) => record_type,
73
- None => return Err ( DeError :: custom ( "Could not find RecordType" ) ) ,
74
- } ;
75
-
76
124
let ttl = match seq. next_element :: < u32 > ( ) ? {
77
125
Some ( ttl) => ttl,
78
126
None => return Err ( DeError :: custom ( "Could not find TTL" ) ) ,
79
127
} ;
80
128
81
- let record_set = Arc :: new ( RecordSet :: with_ttl ( self . 0 , record_type, ttl) ) ;
129
+ // todo: finish this code
130
+ let mut record_set = RecordSet :: with_ttl ( self . 0 , self . 1 , ttl) ;
131
+ while let Some ( data) = seq. next_element :: < & str > ( ) ? {
132
+ match self . 1 {
133
+ _ => return Err ( DeError :: custom ( "Invalid key" ) )
134
+ }
135
+ }
82
136
83
- Ok ( ( record_type , record_set) )
137
+ Ok ( Arc :: new ( record_set) )
84
138
}
85
139
}
86
140
87
- deserializer. deserialize_seq ( RecordDataVisitor ( self . 0 ) )
141
+ deserializer. deserialize_seq ( RecordVisitor ( self . 0 , self . 1 ) )
88
142
}
89
143
}
0 commit comments