@@ -35,8 +35,7 @@ pub type Model {
3535 /// Stores the content of the `https://hexdocs.pm/package_names.csv`.
3636 packages : List ( String ) ,
3737 /// Stores the different versions of a package.
38- /// `Dict(Package Name, hexpm.Package)`.
39- packages_versions : Dict ( String , hexpm . Package ) ,
38+ packages_versions : Dict ( String , Option ( hexpm . Package ) ) ,
4039 /// Stores the open state of the sidebar.
4140 sidebar_opened : Bool ,
4241 dom_click_sidebar_unsubscriber : Option ( fn ( ) -> Nil ) ,
@@ -119,14 +118,26 @@ pub fn add_packages(model: Model, packages: List(String)) -> Model {
119118 Model ( .. model , packages : )
120119}
121120
122- pub fn add_packages_versions (
123- model : Model ,
124- packages : List ( hexpm . Package ) ,
125- ) -> Model {
126- use model , package <- list . fold ( packages , model )
127- Model ( .. model , packages_versions : {
128- dict . insert ( model . packages_versions , package . name , package )
129- } )
121+ pub fn add_packages_versions ( model : Model , packages : List ( hexpm . Package ) ) {
122+ let packages_versions = {
123+ use packages_versions , package <- list . fold (
124+ packages ,
125+ model . packages_versions ,
126+ )
127+ dict . insert ( packages_versions , package . name , Some ( package ) )
128+ }
129+ Model ( .. model , packages_versions : )
130+ }
131+
132+ pub fn add_missing_packages ( model : Model , packages : List ( String ) ) {
133+ let packages_versions = {
134+ use packages_versions , package <- list . fold (
135+ packages ,
136+ model . packages_versions ,
137+ )
138+ dict . insert ( packages_versions , package , None )
139+ }
140+ Model ( .. model , packages_versions : )
130141}
131142
132143pub fn toggle_sidebar ( model : Model ) {
@@ -233,18 +244,23 @@ pub fn update_route(model: Model, route: uri.Uri) {
233244 return : version . Package ( package , version , resolved : True ) ,
234245 )
235246 case dict . get ( model . packages_versions , package ) {
247+ // We didn't index it yet
236248 Error ( _ ) -> version . Package ( package , version , resolved : False )
237- Ok ( versions ) -> {
238- case versions . releases {
239- [ ] -> version . Package ( package , version , resolved : False )
249+ // We tried but we could not find it
250+ Ok ( None ) -> version . Package ( package , version , resolved : True )
251+ // We found the packages
252+ Ok ( Some ( hex_package ) ) -> {
253+ case hex_package . releases {
254+ [ ] -> version . Package ( package , version , resolved : True )
240255 [ release , .. ] ->
241256 version . Package ( package , release . version , resolved : True )
242257 }
243258 }
244259 }
245260 }
246261
247- let latest = list . filter ( packages , fn ( p ) { p . version == "latest" } )
262+ let latest =
263+ list . filter ( packages , fn ( p ) { p . version == "latest" && ! p . resolved } )
248264
249265 let model =
250266 Model ( .. model , search_input : q , search_packages_filters : packages )
@@ -312,10 +328,7 @@ pub fn select_autocomplete_option(model: Model, package: String) {
312328 Version -> {
313329 let version = package
314330 let package = model . search_packages_filter_input_displayed
315- model . packages_versions
316- |> dict . get ( package )
317- |> result . map ( fn ( package ) { package . releases } )
318- |> result . try ( list . find ( _, fn ( r ) { r . version == version } ) )
331+ find_matching_package_version ( model , package , version )
319332 |> result . map ( fn ( _ ) {
320333 Model (
321334 .. model ,
@@ -330,6 +343,22 @@ pub fn select_autocomplete_option(model: Model, package: String) {
330343 }
331344}
332345
346+ pub fn find_matching_package_version (
347+ model : Model ,
348+ package : String ,
349+ version : String ,
350+ ) {
351+ model . packages_versions
352+ |> dict . get ( package )
353+ |> result . try ( fn ( maybe_package ) {
354+ case maybe_package {
355+ None -> Error ( Nil )
356+ Some ( package ) -> Ok ( package . releases )
357+ }
358+ } )
359+ |> result . try ( list . find ( _, fn ( r ) { r . version == version } ) )
360+ }
361+
333362/// When going from the home page, where you have a free text input to the
334363/// search page, it's needed to keep the different parts of the search, while
335364/// changing how they're handled in the model. That function transforms the
@@ -398,11 +427,12 @@ fn extract_packages_filters_or_fetches(model: Model) {
398427 None -> {
399428 case dict . get ( model . packages_versions , package ) {
400429 Error ( _ ) -> # ( filters , [ package , .. packages_to_fetch ] )
401- Ok ( versionned ) -> {
402- case list . first ( versionned . releases ) {
430+ Ok ( None ) -> # ( filters , packages_to_fetch )
431+ Ok ( Some ( hex_package ) ) -> {
432+ case hex_package . releases {
403433 // That case is impossible, returning the neutral element.
404- Error ( _ ) -> # ( filters , packages_to_fetch )
405- Ok ( release ) -> {
434+ [ ] -> # ( filters , packages_to_fetch )
435+ [ release , .. ] -> {
406436 let ver = release . version
407437 # (
408438 [
@@ -488,12 +518,12 @@ pub fn autocomplete_versions(model: Model, search: String) {
488518 Error ( _ ) -> # ( model , effect . none ( ) )
489519 Ok ( # ( package , version ) ) -> {
490520 case dict . get ( model . packages_versions , package ) {
491- Error ( _ ) ->
521+ Error ( _ ) | Ok ( None ) ->
492522 case list . contains ( model . packages , package ) {
493523 True -> # ( model , effects . package_versions ( package ) )
494524 False -> # ( model , effect . none ( ) )
495525 }
496- Ok ( package ) -> {
526+ Ok ( Some ( package ) ) -> {
497527 let versions = list . map ( package . releases , fn ( r ) { r . version } )
498528 let autocomplete = autocomplete . init ( versions , version )
499529 let autocomplete = # ( Version , autocomplete )
0 commit comments