@@ -84,6 +84,7 @@ pub enum Specifier {
8484 Tag ( Raw ) ,
8585 Unsupported ( Raw ) ,
8686 Url ( Raw ) ,
87+ Link ( Raw ) ,
8788 WorkspaceProtocol ( WorkspaceProtocol ) ,
8889}
8990
@@ -132,6 +133,9 @@ impl Specifier {
132133 if first_char == 'f' && value. starts_with ( "file:" ) {
133134 return Self :: File ( raw:: Raw { raw : value. to_string ( ) } ) ;
134135 }
136+ if first_char == 'l' && value. starts_with ( "link:" ) {
137+ return Self :: Link ( raw:: Raw { raw : value. to_string ( ) } ) ;
138+ }
135139 if first_char == 'h' && ( value. starts_with ( "http://" ) || value. starts_with ( "https://" ) ) {
136140 return Self :: Url ( raw:: Raw { raw : value. to_string ( ) } ) ;
137141 }
@@ -324,6 +328,7 @@ impl Specifier {
324328 Self :: ComplexSemver ( s) => Self :: ComplexSemver ( s. with_range ( range) ) ,
325329 Self :: File ( s) => Self :: File ( s. with_range ( range) ) ,
326330 Self :: Git ( s) => Self :: Git ( s. with_range ( range) ) ,
331+ Self :: Link ( s) => Self :: Link ( s. with_range ( range) ) ,
327332 Self :: None => Self :: None ,
328333 Self :: Tag ( s) => Self :: Tag ( s. with_range ( range) ) ,
329334 Self :: Unsupported ( s) => Self :: Unsupported ( s. with_range ( range) ) ,
@@ -342,6 +347,7 @@ impl Specifier {
342347 Self :: ComplexSemver ( s) => Self :: ComplexSemver ( s. with_semver ( semver) ) ,
343348 Self :: File ( s) => Self :: File ( s. with_semver ( semver) ) ,
344349 Self :: Git ( s) => Self :: Git ( s. with_semver ( semver) ) ,
350+ Self :: Link ( s) => Self :: Link ( s. with_semver ( semver) ) ,
345351 Self :: None => Self :: None ,
346352 Self :: Tag ( s) => Self :: Tag ( s. with_semver ( semver) ) ,
347353 Self :: Unsupported ( s) => Self :: Unsupported ( s. with_semver ( semver) ) ,
@@ -357,6 +363,7 @@ impl Specifier {
357363 Self :: ComplexSemver ( inner) => inner. raw . clone ( ) ,
358364 Self :: File ( inner) => inner. raw . clone ( ) ,
359365 Self :: Git ( inner) => inner. raw . clone ( ) ,
366+ Self :: Link ( inner) => inner. raw . clone ( ) ,
360367 Self :: None => "" . to_string ( ) ,
361368 Self :: Tag ( inner) => inner. raw . clone ( ) ,
362369 Self :: Unsupported ( inner) => inner. raw . clone ( ) ,
@@ -388,6 +395,7 @@ impl Specifier {
388395 Self :: ComplexSemver ( _) => "range-complex" ,
389396 Self :: File ( _) => "file" ,
390397 Self :: Git ( _) => "git" ,
398+ Self :: Link ( _) => "link" ,
391399 Self :: None => "missing" ,
392400 Self :: Tag ( _) => "tag" ,
393401 Self :: Unsupported ( _) => "unsupported" ,
@@ -427,6 +435,10 @@ impl Specifier {
427435 matches ! ( self , Self :: WorkspaceProtocol ( _) )
428436 }
429437
438+ pub fn is_link ( & self ) -> bool {
439+ matches ! ( self , Self :: Link ( _) )
440+ }
441+
430442 /// Are both specifiers on eg. "-alpha", or neither have a release channel?
431443 pub fn has_same_release_channel_as ( & self , other : & Specifier ) -> bool {
432444 if let ( Some ( a) , Some ( b) ) = ( self . get_node_version ( ) , other. get_node_version ( ) ) {
0 commit comments