@ -1021,6 +1021,10 @@ pub mod generic {
let ret = & decoded [ 0 .. tag_pos ] ;
decoded = & decoded [ tag_pos + 1 .. ] ;
ret
} else if decoded . as_bytes ( ) . starts_with ( b" body " ) {
let ret = & decoded [ 0 .. "body" . len ( ) ] ;
decoded = & decoded [ ( "body" . len ( ) + 1 ) .. ] ;
ret
} else {
return Err ( nom ::Err ::Error (
(
@ -1031,11 +1035,15 @@ pub mod generic {
) ) ;
} ;
let value_end = decoded
. as_bytes ( )
. iter ( )
. position ( | e | * e = = b'&' )
. unwrap_or ( decoded . len ( ) ) ;
let value_end = if tag = = "body" {
decoded . len ( )
} else {
decoded
. as_bytes ( )
. iter ( )
. position ( | e | * e = = b'&' )
. unwrap_or ( decoded . len ( ) )
} ;
let value = decoded [ .. value_end ] . to_string ( ) ;
match tag {
@ -3145,4 +3153,71 @@ border=3D=220=22>
let c = msg_id ( s ) . unwrap ( ) . 1 ;
assert_eq! ( & msg_id_list ( value ) . unwrap ( ) . 1 , & [ a , c ] ) ;
}
#[ rustfmt::skip ]
#[ test ]
fn test_mailto_parse ( ) {
let value = " mailto :1001084 @ bugs . debian . org ? In - Reply - To = % 3 C168435582154 . 540248. \
1403466294276093439 % 40 xxxxxxxxxxxxxx % 3 E & References = % 3 C163857393129 . 1083042. \
11053317018847169002. reportbug % 40 xxxxxxxxxxxxxx % 3 E % 0 A % 20 % 3 C168435582154 . 540248. \
1403466294276093439 % 40 xxxxxxxxxxxxxx % 3 E & subject = Re % 3 A % 20 ITP % 3 A % 20 meli % 20 - - % \
20 terminal % 20 mail % 20 client & body = On % 20 Wed % 2 C % 2017 % 20 May % 202023 % 2022 % 3 A37 % 3 A01 % 20 % \
2 B0200 % 20 xxxxx % 20 zzzzzzzzzz % 20 % 3 Cdr % 40 xxxxxxxx % 3 E % 20 wrote % 3 A % 0 A % 3 E % 200. 7.2 % \
2 B20230517 % 20 draft % 201 % 20 needs % 20 embedding % 208 % 20 crates % 20 % 286 % 20 missing % 2 C % 201 % \
20 unwanted % 2 C % 201 % 20 ahead % 29 % 3 B % 0 A % 3 E % 20 runs % 20 and % 20 seems % 20 to % 20 work % 20 from % 20 a % \
20 brief % 20 test % 20 use . % 0 A % 3 E % 20 % 0 A % 3 E % 20 Main % 20 tasks % 20 are % 20 still % 20 to % 20 keep % \
20 package % 20 up - to - date % 20 with % 20 upstream % 20 releases % 2 C % 20 and % 0 A % 3 E % 20 to % 20 package % \
20 more % 20 of % 20 the % 20 crates % 20 currently % 20 embedded . % 0 A % 3 E % 20 % 0 A % 3 E % 20 Here % 27 s % 20 how % \
20 you % 20 can % 20 help % 3 A % 0 A % 3 E % 20 % 0 A % 3 E % 20 As % 20 user % 20 running % 20 Debian % 2 C % 20 you % 20 can % \
20 test % 20 this % 20 draft % 20 package % 3 A % 20 Either % 20 build % 20 it % 0 A % 3 E % 20 yourself % 20 from % \
20 source % 20 or % 20 tell % 20 % 28 by % 20 posting % 20 to % 20 this % 20 bugreport % 29 % 20 if % 20 you % 0 A % 3 E % \
20 prefer % 20 testing % 20 the % 20 binary % 20 packages % 20 I % 20 built % 20 - % 20 then % 20 I % 20 will % \
20 share % 20 those . % 0 A % 3 E % 20 % 0 A % 3 E % 20 As % 20 developer % 20 % 28 but % 20 no % 20 need % 20 to % 20 be % \
20 official % 20 member % 20 of % 20 Debian % 21 % 29 % 2 C % 20 you % 20 can % 0 A % 3 E % 20 join % 20 the % 20 Debian % \
20 Rust % 20 team % 20 and % 20 help % 20 package % 20 these % 20 missing % 20 crates % 3 A % 0 A % 3 E % 20 https % 3 A % \
2 F % 2 Fsalsa . debian . org % 2 Fdebian % 2 Fmeli % 2 F - % 2 Fblob % 2 Fdebian % 2 Flatest % 2 Fdebian % 2 FTODO % \
0 A % 3 E % 20 % 0 A % 3 E % 20 % 0 A % 3 E % 20 % 20 - % 20 JJJJJ % 0 A % 3 E % 20 % 0 A % 3 E % 20 - - % 20 % 0 A % 3 E % 20 % 20 % 2 A % 20 JJJJJ % \
20 xxxxxxxxxx % 20 - % 20 idealist % 20 % 26 % 20 Internet - arkitekt % 0 A % 3 E % 20 % 20 % 2 A % 20 Tlf . % 3 A % 20 % \
2 B45 % 20 % 20 % 20 Website % 3 A % 20 http % 3 A % 2 F % 2 Fxxxxxxxxxxx % 2 F % 0 A % 3 E % 20 % 0 A % 3 E % 20 % 20 % 5 Bx % 5 D % \
20 quote % 20 me % 20 freely % 20 % 20 % 5 B % 20 % 5 D % 20 ask % 20 before % 20 reusing % 20 % 20 % 5 B % 20 % 5 D % 20 keep % \
20 private " ;
let ( rest , mailto ) = crate ::parser ::generic ::mailto ( value . as_bytes ( ) )
. map_err ( | err | match err {
nom ::Err ::Failure ( err ) | nom ::Err ::Error ( err ) = > {
format! (
"kind {:?} at: {:?}" ,
err ,
String ::from_utf8_lossy ( err . input )
)
}
nom ::Err ::Incomplete ( _ ) = > "incomplete input" . to_string ( ) ,
} )
. unwrap ( ) ;
println! (
"rest = {}, mailto = {:#?}" ,
String ::from_utf8_lossy ( rest ) ,
mailto
) ;
assert_eq! (
mailto ,
Mailto {
address : vec ! [
Address ::new ( None , "1001084@bugs.debian.org" . to_string ( ) )
] ,
body : Some (
"On Wed, 17 May 2023 22:37:01 +0200 xxxxx zzzzzzzzzz <dr@xxxxxxxx> wrote:\n> 0.7.2+20230517 draft 1 needs embedding 8 crates (6 missing, 1 unwanted, 1 ahead);\n> runs and seems to work from a brief test use.\n> \n> Main tasks are still to keep package up-to-date with upstream releases, and\n> to package more of the crates currently embedded.\n> \n> Here's how you can help:\n> \n> As user running Debian, you can test this draft package: Either build it\n> yourself from source or tell (by posting to this bugreport) if you\n> prefer testing the binary packages I built - then I will share those.\n> \n> As developer (but no need to be official member of Debian!), you can\n> join the Debian Rust team and help package these missing crates:\n> https://salsa.debian.org/debian/meli/-/blob/debian/latest/debian/TODO\n> \n> \n> - JJJJJ\n> \n> -- \n> * JJJJJ xxxxxxxxxx - idealist & Internet-arkitekt\n> * Tlf.: +45 Website: http://xxxxxxxxxxx/\n> \n> [x] quote me freely [ ] ask before reusing [ ] keep private" . to_string ( ) ,
) ,
headers : {
let mut map = HeaderMap ::new ( ) ;
map . insert ( HeaderName ::TO , "1001084@bugs.debian.org" . into ( ) ) ;
map . insert ( HeaderName ::IN_REPLY_TO , "<168435582154.540248.1403466294276093439@xxxxxxxxxxxxxx>" . into ( ) ) ;
map . insert ( HeaderName ::REFERENCES , "<163857393129.1083042.11053317018847169002.reportbug@xxxxxxxxxxxxxx>\n <168435582154.540248.1403466294276093439@xxxxxxxxxxxxxx>" . into ( ) ) ;
map . insert ( HeaderName ::SUBJECT , "Re: ITP: meli -- terminal mail client" . into ( ) ) ;
map
} ,
} ) ;
}
}