pth/transitive.rs
1/// Define a private namespace for all its items.
2mod private
3{
4 // xxx : move to derive_tools
5
6 // qqq : write tests, lool into example
7 //
8 // impl< Initial > TransitiveTryFrom< AbsolutePath, PathError, Initial >
9 // for CrateDir
10 // where
11 // AbsolutePath : TryFrom< Initial >,
12 // PathError : From< < AbsolutePath as TryFrom< Initial > >::Error >,
13 // {
14 // }
15
16 // qqq : implement transitive_from
17 // qqq : implement transitive_into
18
19 // qqq : move to derive_tools
20 // qqq : write tests, look into example
21 //
22 // impl< Initial > TransitiveTryFrom< AbsolutePath, PathError, Initial >
23 // for CrateDir
24 // where
25 // AbsolutePath : TryFrom< Initial >,
26 // PathError : From< < AbsolutePath as TryFrom< Initial > >::Error >,
27 // {
28 // }
29 // qqq : implement transitive_try_into
30 // qqq : implement transitive_from
31 // qqq : implement transitive_into
32
33 /// A trait to perform a transitive `try_from` conversion.
34 ///
35 /// This trait allows for a two-step conversion process where an initial type `Initial`
36 /// is first converted to an intermediate type `Transitive`, and then to the final type `Self`.
37 ///
38 /// # Type Parameters
39 ///
40 /// - `Error`: The error type that can be produced during the conversion.
41 /// - `Initial`: The initial type from which the conversion starts.
42 ///
43 /// # Requirements
44 ///
45 /// - `Transitive` must implement `TryFrom<Initial>`.
46 /// - `Self` must implement `TryFrom<Transitive>` with the same error type.
47 /// - `Error` must implement `From<<Transitive as TryFrom<Initial>>::Error>`.
48 ///
49 /// # Example
50 ///
51 /// ```rust
52 /// use pth::TransitiveTryFrom;
53 /// use std::convert::TryFrom;
54 ///
55 /// struct InitialType;
56 /// struct IntermediateType;
57 /// struct FinalType;
58 /// struct ConversionError;
59 ///
60 /// impl TryFrom< InitialType > for IntermediateType
61 /// {
62 /// type Error = ConversionError;
63 /// fn try_from( value : InitialType ) -> Result< Self, Self::Error >
64 /// {
65 /// // Conversion logic here
66 /// Ok( IntermediateType )
67 /// }
68 /// }
69 ///
70 /// impl TryFrom< IntermediateType > for FinalType
71 /// {
72 /// type Error = ConversionError;
73 /// fn try_from( value : IntermediateType ) -> Result< Self, Self::Error >
74 /// {
75 /// // Conversion logic here
76 /// Ok( FinalType )
77 /// }
78 /// }
79 ///
80 /// let initial = InitialType;
81 /// let final_result : Result< FinalType, ConversionError > = FinalType::transitive_try_from::< IntermediateType >( initial );
82 /// ```
83 pub trait TransitiveTryFrom< Error, Initial >
84 {
85 /// Performs a transitive `try_from` conversion.
86 ///
87 /// This method first converts the `src` of type `Initial` to the intermediate type `Transitive`,
88 /// and then converts the intermediate type to the final type `Self`.
89 ///
90 /// # Arguments
91 ///
92 /// - `src`: The initial value to be converted.
93 ///
94 /// # Returns
95 ///
96 /// - `Ok(Self)`: If both conversions succeed.
97 /// - `Err(Error)`: If either conversion fails.
98 ///
99 /// # Example
100 ///
101 /// See the trait-level documentation for an example.
102 ///
103 /// # Errors
104 /// qqq: doc
105 #[ inline( always ) ]
106 fn transitive_try_from< Transitive >( src : Initial ) -> Result< Self, Error >
107 where
108 Transitive : TryFrom< Initial >,
109 Self : TryFrom< Transitive, Error = Error >,
110 Error : From< < Transitive as TryFrom< Initial > >::Error >,
111 {
112 let src2 = TryFrom::< Initial >::try_from( src )?;
113 TryFrom::< Transitive >::try_from( src2 )
114 }
115 }
116
117 impl< Initial, Error, Final > TransitiveTryFrom< Error, Initial > for Final {}
118
119 /// A trait to perform a transitive `try_into` conversion.
120 ///
121 /// This trait allows for a two-step conversion process where an initial type `Self`
122 /// is first converted to an intermediate type `Transitive`, and then to the final type `Final`.
123 ///
124 /// # Type Parameters
125 ///
126 /// - `Error`: The error type that can be produced during the conversion.
127 /// - `Final`: The final type to which `Transitive` is converted.
128 ///
129 /// # Requirements
130 ///
131 /// - `Self` must implement `TryInto<Transitive>`.
132 /// - `Transitive` must implement `TryInto<Final>` with the same error type.
133 /// - `Error` must implement `From<<Self as TryInto<Transitive>>::Error>`.
134 ///
135 /// # Example
136 ///
137 /// ```rust
138 /// use pth::TransitiveTryInto;
139 /// use std::convert::TryInto;
140 ///
141 /// struct InitialType;
142 /// struct IntermediateType;
143 /// struct FinalType;
144 /// struct ConversionError;
145 ///
146 /// impl TryInto< IntermediateType > for InitialType
147 /// {
148 /// type Error = ConversionError;
149 /// fn try_into( self ) -> Result< IntermediateType, Self::Error >
150 /// {
151 /// // Conversion logic here
152 /// Ok( IntermediateType )
153 /// }
154 /// }
155 ///
156 /// impl TryInto< FinalType > for IntermediateType
157 /// {
158 /// type Error = ConversionError;
159 /// fn try_into( self ) -> Result< FinalType, Self::Error >
160 /// {
161 /// // Conversion logic here
162 /// Ok( FinalType )
163 /// }
164 /// }
165 ///
166 /// let initial = InitialType;
167 /// let final_result : Result< FinalType, ConversionError > = initial.transitive_try_into::< IntermediateType >();
168 /// ```
169 pub trait TransitiveTryInto< Error, Final > : Sized
170 {
171 /// Performs a transitive `try_into` conversion.
172 ///
173 /// This method first converts `self` to the intermediate type `Transitive`,
174 /// and then converts the intermediate type to the final type `Final`.
175 ///
176 /// # Returns
177 ///
178 /// - `Ok(Final)`: If both conversions succeed.
179 /// - `Err(Error)`: If either conversion fails.
180 ///
181 /// # Example
182 ///
183 /// See the trait-level documentation for an example.
184 /// # Errors
185 /// qqq: doc
186 #[ inline( always ) ]
187 fn transitive_try_into< Transitive >( self ) -> Result< Final, Error >
188 where
189 Self : TryInto< Transitive >,
190 Transitive : TryInto< Final, Error = Error >,
191 Error : From< < Self as TryInto< Transitive > >::Error >,
192 {
193 let src2 = TryInto::< Transitive >::try_into( self )?;
194 TryInto::< Final >::try_into( src2 )
195 }
196 }
197
198 impl< Error, Final, Initial > TransitiveTryInto< Error, Final > for Initial {}
199
200}
201
202crate::mod_interface!
203{
204 exposed use TransitiveTryFrom;
205 exposed use TransitiveTryInto;
206}