@@ -82,27 +82,31 @@ impl<'de> de::Deserialize<'de> for PackageId {
8282 D : de:: Deserializer < ' de > ,
8383 {
8484 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" ) ) ?;
10098 let source_id = SourceId :: from_url ( url) . map_err ( de:: Error :: custom) ?;
10199
102100 Ok ( PackageId :: pure ( name, version, source_id) )
103101 }
104102}
105103
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+
106110impl PartialEq for PackageId {
107111 fn eq ( & self , other : & PackageId ) -> bool {
108112 if ptr:: eq ( self . inner , other. inner ) {
0 commit comments