@@ -82,27 +82,31 @@ impl<'de> de::Deserialize<'de> for PackageId {
82
82
D : de:: Deserializer < ' de > ,
83
83
{
84
84
let string = String :: deserialize ( d) ?;
85
- let mut s = string. splitn ( 3 , ' ' ) ;
86
- let name = s. next ( ) . unwrap ( ) ;
87
- let name = InternedString :: new ( name) ;
88
- let Some ( version) = s. next ( ) else {
89
- return Err ( de:: Error :: custom ( "invalid serialized PackageId" ) ) ;
90
- } ;
91
- let version = version. to_semver ( ) . map_err ( de:: Error :: custom) ?;
92
- let Some ( url) = s. next ( ) else {
93
- return Err ( de:: Error :: custom ( "invalid serialized PackageId" ) ) ;
94
- } ;
95
- let url = if url. starts_with ( '(' ) && url. ends_with ( ')' ) {
96
- & url[ 1 ..url. len ( ) - 1 ]
97
- } else {
98
- return Err ( de:: Error :: custom ( "invalid serialized PackageId" ) ) ;
99
- } ;
85
+
86
+ let ( field, rest) = string
87
+ . split_once ( ' ' )
88
+ . ok_or_else ( || de:: Error :: custom ( "invalid serialized PackageId" ) ) ?;
89
+ let name = InternedString :: new ( field) ;
90
+
91
+ let ( field, rest) = rest
92
+ . split_once ( ' ' )
93
+ . ok_or_else ( || de:: Error :: custom ( "invalid serialized PackageId" ) ) ?;
94
+ let version = field. to_semver ( ) . map_err ( de:: Error :: custom) ?;
95
+
96
+ let url =
97
+ strip_parens ( rest) . ok_or_else ( || de:: Error :: custom ( "invalid serialized PackageId" ) ) ?;
100
98
let source_id = SourceId :: from_url ( url) . map_err ( de:: Error :: custom) ?;
101
99
102
100
Ok ( PackageId :: pure ( name, version, source_id) )
103
101
}
104
102
}
105
103
104
+ fn strip_parens ( value : & str ) -> Option < & str > {
105
+ let value = value. strip_prefix ( '(' ) ?;
106
+ let value = value. strip_suffix ( ')' ) ?;
107
+ Some ( value)
108
+ }
109
+
106
110
impl PartialEq for PackageId {
107
111
fn eq ( & self , other : & PackageId ) -> bool {
108
112
if ptr:: eq ( self . inner , other. inner ) {
0 commit comments