@@ -97,15 +97,30 @@ impl std::fmt::Display for CrateVersion {
9797 }
9898}
9999
100+ // Reference: https://github.com/rust-lang/crates.io/blob/98c83c8231cbcd15d6b8f06d80a00ad462f71585/src/views.rs#L274
101+ #[ derive( serde:: Deserialize ) ]
102+ struct CrateMetadata {
103+ /// The "default" version of this crate.
104+ ///
105+ /// This version will be displayed by default on the crate's page.
106+ pub default_version : Option < String > ,
107+ }
108+
109+ // Reference: https://github.com/rust-lang/crates.io/blob/98c83c8231cbcd15d6b8f06d80a00ad462f71585/src/controllers/krate/metadata.rs#L44
110+ #[ derive( serde:: Deserialize ) ]
111+ struct CrateIoGetResponse {
112+ /// The crate metadata.
113+ #[ serde( rename = "crate" ) ]
114+ krate : CrateMetadata ,
115+ }
116+
100117pub fn crate_latest_version ( name : & str ) -> Option < String > {
101- let url = format ! ( "https://docs.rs/crate/{name}/" ) ;
102- let response = ureq:: get ( & url) . call ( ) . ok ( ) ?;
103- if response. status ( ) . is_redirection ( ) {
104- if let Some ( location) = response. headers ( ) . get ( "location" ) {
105- return location. to_str ( ) . ok ( ) . map ( |s| s. replace ( & url, "" ) ) ;
106- }
107- }
108- None
118+ // Reference: https://github.com/rust-lang/crates.io/blob/98c83c8231cbcd15d6b8f06d80a00ad462f71585/src/controllers/krate/metadata.rs#L88
119+ let url = format ! ( "https://crates.io/api/v1/crates/{name}?include" ) ;
120+ let mut response = ureq:: get ( & url) . call ( ) . ok ( ) ?;
121+ let metadata: CrateIoGetResponse =
122+ serde_json:: from_reader ( response. body_mut ( ) . as_reader ( ) ) . unwrap ( ) ;
123+ metadata. krate . default_version
109124}
110125
111126pub fn crate_version (
0 commit comments