@@ -23,10 +23,10 @@ pub struct Trailers<'a> {
23
23
#[ derive( PartialEq , Eq , Debug , Hash , Ord , PartialOrd , Clone , Copy ) ]
24
24
#[ cfg_attr( feature = "serde" , derive( serde:: Serialize , serde:: Deserialize ) ) ]
25
25
pub struct TrailerRef < ' a > {
26
- /// The name of the trailer, like "Signed-off-by", up to the separator ": "
26
+ /// The name of the trailer, like "Signed-off-by", up to the separator `: `.
27
27
#[ cfg_attr( feature = "serde" , serde( borrow) ) ]
28
28
pub token : & ' a BStr ,
29
- /// The value right after the separator ": " , with leading and trailing whitespace trimmed.
29
+ /// The value right after the separator `: ` , with leading and trailing whitespace trimmed.
30
30
/// Note that multi-line values aren't currently supported.
31
31
pub value : & ' a BStr ,
32
32
}
@@ -93,7 +93,7 @@ impl<'a> BodyRef<'a> {
93
93
self . body_without_trailer
94
94
}
95
95
96
- /// Return an iterator over the trailers parsed from the last paragraph of the body. May be empty.
96
+ /// Return an iterator over the trailers parsed from the last paragraph of the body. Maybe empty.
97
97
pub fn trailers ( & self ) -> Trailers < ' a > {
98
98
Trailers {
99
99
cursor : self . start_of_trailer ,
@@ -115,72 +115,65 @@ impl Deref for BodyRef<'_> {
115
115
}
116
116
}
117
117
118
+ /// Convenience methods
118
119
impl TrailerRef < ' _ > {
119
- /// Check if this trailer is a " Signed-off-by" trailer (case-insensitive).
120
+ /// Check if this trailer is a ` Signed-off-by` trailer (case-insensitive).
120
121
pub fn is_signed_off_by ( & self ) -> bool {
121
122
self . token . eq_ignore_ascii_case ( b"Signed-off-by" )
122
123
}
123
124
124
- /// Check if this trailer is a " Co-authored-by" trailer (case-insensitive).
125
+ /// Check if this trailer is a ` Co-authored-by` trailer (case-insensitive).
125
126
pub fn is_co_authored_by ( & self ) -> bool {
126
127
self . token . eq_ignore_ascii_case ( b"Co-authored-by" )
127
128
}
128
129
129
- /// Check if this trailer is an " Acked-by" trailer (case-insensitive).
130
+ /// Check if this trailer is an ` Acked-by` trailer (case-insensitive).
130
131
pub fn is_acked_by ( & self ) -> bool {
131
132
self . token . eq_ignore_ascii_case ( b"Acked-by" )
132
133
}
133
134
134
- /// Check if this trailer is a " Reviewed-by" trailer (case-insensitive).
135
+ /// Check if this trailer is a ` Reviewed-by` trailer (case-insensitive).
135
136
pub fn is_reviewed_by ( & self ) -> bool {
136
137
self . token . eq_ignore_ascii_case ( b"Reviewed-by" )
137
138
}
138
139
139
- /// Check if this trailer is a " Tested-by" trailer (case-insensitive).
140
+ /// Check if this trailer is a ` Tested-by` trailer (case-insensitive).
140
141
pub fn is_tested_by ( & self ) -> bool {
141
142
self . token . eq_ignore_ascii_case ( b"Tested-by" )
142
143
}
143
144
144
145
/// Check if this trailer represents any kind of authorship or attribution
145
- /// (Signed-off-by, Co-authored-by, etc.).
146
+ /// (` Signed-off-by`, ` Co-authored-by` , etc.).
146
147
pub fn is_attribution ( & self ) -> bool {
147
148
self . is_signed_off_by ( )
148
149
|| self . is_co_authored_by ( )
149
150
|| self . is_acked_by ( )
150
151
|| self . is_reviewed_by ( )
151
152
|| self . is_tested_by ( )
152
153
}
153
-
154
- /// Get the token as a case-normalized string for comparison purposes.
155
- /// This can be useful for custom filtering logic.
156
- pub fn token_normalized ( & self ) -> String {
157
- String :: from_utf8_lossy ( self . token ) . to_ascii_lowercase ( )
158
- }
159
154
}
160
155
156
+ /// Convenience methods
161
157
impl < ' a > Trailers < ' a > {
162
- /// Filter trailers to only include " Signed-off-by" entries.
158
+ /// Filter trailers to only include ` Signed-off-by` entries.
163
159
pub fn signed_off_by ( self ) -> impl Iterator < Item = TrailerRef < ' a > > {
164
160
self . filter ( TrailerRef :: is_signed_off_by)
165
161
}
166
162
167
- /// Filter trailers to only include " Co-authored-by" entries.
163
+ /// Filter trailers to only include ` Co-authored-by` entries.
168
164
pub fn co_authored_by ( self ) -> impl Iterator < Item = TrailerRef < ' a > > {
169
165
self . filter ( TrailerRef :: is_co_authored_by)
170
166
}
171
167
172
- /// Filter trailers to only include attribution-related entries
173
- /// (Signed-off-by, Co-authored-by, Acked-by, Reviewed-by, Tested-by).
168
+ /// Filter trailers to only include attribution-related entries.
169
+ /// (` Signed-off-by`, ` Co-authored-by`, ` Acked-by`, ` Reviewed-by`, ` Tested-by` ).
174
170
pub fn attributions ( self ) -> impl Iterator < Item = TrailerRef < ' a > > {
175
171
self . filter ( TrailerRef :: is_attribution)
176
172
}
177
173
178
- /// Collect all unique authors from Signed-off-by and Co-authored-by trailers.
179
- /// Returns a Vec of author strings.
180
- pub fn collect_authors ( self ) -> Vec < & ' a BStr > {
174
+ /// Filter trailers to only include authors from `Signed-off-by` and `Co-authored-by` entries.
175
+ pub fn authors ( self ) -> impl Iterator < Item = TrailerRef < ' a > > {
181
176
self . filter ( |trailer| trailer. is_signed_off_by ( ) || trailer. is_co_authored_by ( ) )
182
- . map ( |trailer| trailer. value )
183
- . collect ( )
184
177
}
185
178
}
186
179
@@ -221,68 +214,3 @@ mod test_parse_trailer {
221
214
assert_eq ! ( parse( "foo: bar\r \n " ) , ( "foo" . into( ) , "bar" . into( ) ) ) ;
222
215
}
223
216
}
224
-
225
- #[ cfg( test) ]
226
- mod test_trailer_convenience {
227
- use super :: * ;
228
-
229
- #[ test]
230
- fn test_signed_off_by_detection ( ) {
231
- let trailer = TrailerRef {
232
- token : "Signed-off-by" . into ( ) ,
233
- value : "John Doe <john@example.com>" . into ( ) ,
234
- } ;
235
- assert ! ( trailer. is_signed_off_by( ) ) ;
236
- assert ! ( !trailer. is_co_authored_by( ) ) ;
237
- assert ! ( trailer. is_attribution( ) ) ;
238
- }
239
-
240
- #[ test]
241
- fn test_case_insensitive_detection ( ) {
242
- let trailer = TrailerRef {
243
- token : "signed-off-by" . into ( ) ,
244
- value : "John Doe <john@example.com>" . into ( ) ,
245
- } ;
246
- assert ! ( trailer. is_signed_off_by( ) ) ;
247
-
248
- let trailer2 = TrailerRef {
249
- token : "CO-AUTHORED-BY" . into ( ) ,
250
- value : "Jane Smith <jane@example.com>" . into ( ) ,
251
- } ;
252
- assert ! ( trailer2. is_co_authored_by( ) ) ;
253
- assert ! ( trailer2. is_attribution( ) ) ;
254
- }
255
-
256
- #[ test]
257
- fn test_multiple_trailer_types ( ) {
258
- let trailer1 = TrailerRef {
259
- token : "Reviewed-by" . into ( ) ,
260
- value : "Reviewer <reviewer@example.com>" . into ( ) ,
261
- } ;
262
- let trailer2 = TrailerRef {
263
- token : "Custom-Field" . into ( ) ,
264
- value : "Some value" . into ( ) ,
265
- } ;
266
-
267
- assert ! ( trailer1. is_reviewed_by( ) ) ;
268
- assert ! ( trailer1. is_attribution( ) ) ;
269
- assert ! ( !trailer2. is_attribution( ) ) ;
270
- }
271
-
272
- #[ test]
273
- fn test_collect_authors ( ) {
274
- // This would need to be tested with actual Trailers iterator
275
- // but shows the expected behavior
276
- let trailer1 = TrailerRef {
277
- token : "Signed-off-by" . into ( ) ,
278
- value : "John Doe <john@example.com>" . into ( ) ,
279
- } ;
280
- let trailer2 = TrailerRef {
281
- token : "Co-authored-by" . into ( ) ,
282
- value : "Jane Smith <jane@example.com>" . into ( ) ,
283
- } ;
284
-
285
- assert ! ( trailer1. is_signed_off_by( ) ) ;
286
- assert ! ( trailer2. is_co_authored_by( ) ) ;
287
- }
288
- }
0 commit comments