1+ //! Sources for key-value pairs.
2+
3+ pub use key_values:: { KeyValueError , Key , Value } ;
4+
5+ use key_values:: key:: ToKey ;
6+ use key_values:: value:: ToValue ;
7+
8+ /// A source of key-value pairs.
9+ ///
10+ /// The source may be a single pair, a set of pairs, or a filter over a set of pairs.
11+ /// Use the [`Visitor`](struct.Visitor.html) trait to inspect the structured data
12+ /// in a source.
13+ pub trait Source {
14+ /// Visit key-value pairs.
15+ ///
16+ /// A source doesn't have to guarantee any ordering or uniqueness of pairs.
17+ fn visit < ' kvs > ( & ' kvs self , visitor : & mut Visitor < ' kvs > ) -> Result < ( ) , KeyValueError > ;
18+ }
19+
20+ impl < ' a , T > Source for & ' a T
21+ where
22+ T : Source + ?Sized ,
23+ {
24+ fn visit < ' kvs > ( & ' kvs self , visitor : & mut Visitor < ' kvs > ) -> Result < ( ) , KeyValueError > {
25+ ( * * self ) . visit ( visitor)
26+ }
27+ }
28+
29+ impl < K , V > Source for ( K , V )
30+ where
31+ K : ToKey ,
32+ V : ToValue ,
33+ {
34+ fn visit < ' kvs > ( & ' kvs self , visitor : & mut Visitor < ' kvs > ) -> Result < ( ) , KeyValueError > {
35+ visitor. visit_pair ( self . 0 . to_key ( ) , self . 1 . to_value ( ) )
36+ }
37+ }
38+
39+ impl < S > Source for [ S ]
40+ where
41+ S : Source ,
42+ {
43+ fn visit < ' kvs > ( & ' kvs self , visitor : & mut Visitor < ' kvs > ) -> Result < ( ) , KeyValueError > {
44+ for source in self {
45+ source. visit ( visitor) ?;
46+ }
47+
48+ Ok ( ( ) )
49+ }
50+ }
51+
52+ impl < S > Source for Option < S >
53+ where
54+ S : Source ,
55+ {
56+ fn visit < ' kvs > ( & ' kvs self , visitor : & mut Visitor < ' kvs > ) -> Result < ( ) , KeyValueError > {
57+ if let Some ( ref source) = * self {
58+ source. visit ( visitor) ?;
59+ }
60+
61+ Ok ( ( ) )
62+ }
63+ }
64+
65+ /// A visitor for the key-value pairs in a [`Source`](trait.Source.html).
66+ pub trait Visitor < ' kvs > {
67+ /// Visit a key-value pair.
68+ fn visit_pair ( & mut self , key : Key < ' kvs > , value : Value < ' kvs > ) -> Result < ( ) , KeyValueError > ;
69+ }
70+
71+ impl < ' a , ' kvs , T > Visitor < ' kvs > for & ' a mut T
72+ where
73+ T : Visitor < ' kvs > + ?Sized ,
74+ {
75+ fn visit_pair ( & mut self , key : Key < ' kvs > , value : Value < ' kvs > ) -> Result < ( ) , KeyValueError > {
76+ ( * * self ) . visit_pair ( key, value)
77+ }
78+ }
79+
80+ #[ cfg( feature = "std" ) ]
81+ mod std_support {
82+ use super :: * ;
83+
84+ impl < S > Source for Box < S >
85+ where
86+ S : Source + ?Sized ,
87+ {
88+ fn visit < ' kvs > ( & ' kvs self , visitor : & mut Visitor < ' kvs > ) -> Result < ( ) , KeyValueError > {
89+ ( * * self ) . visit ( visitor)
90+ }
91+ }
92+
93+ impl < S > Source for Vec < S >
94+ where
95+ S : Source ,
96+ {
97+ fn visit < ' kvs > ( & ' kvs self , visitor : & mut Visitor < ' kvs > ) -> Result < ( ) , KeyValueError > {
98+ ( * * self ) . visit ( visitor)
99+ }
100+ }
101+ }
102+
103+ #[ cfg( test) ]
104+ mod tests {
105+ use super :: * ;
106+
107+ #[ test]
108+ fn source_is_object_safe ( ) {
109+ fn _check ( _: & Source ) { }
110+ }
111+
112+ #[ test]
113+ fn visitor_is_object_safe ( ) {
114+ fn _check ( _: & Visitor ) { }
115+ }
116+ }
0 commit comments