@@ -71,7 +71,7 @@ pub type Model {
7171 search_packages_filter_version_input : String ,
7272 search_packages_filter_version_input_displayed : String ,
7373 /// Store the current set packages filters.
74- search_packages_filters : List ( # ( String , String ) ) ,
74+ search_packages_filters : List ( version . Package ) ,
7575 )
7676}
7777
@@ -226,47 +226,60 @@ pub fn update_route(model: Model, route: uri.Uri) {
226226 case route {
227227 route . Home | route . NotFound -> # ( model , effect . none ( ) )
228228 route . Search ( q : , packages : ) -> {
229- case string . is_empty ( q ) {
230- True -> # ( set_search_results ( model , # ( - 1 , [ ] ) ) , effect . none ( ) )
231- False -> {
232- let latest = list . filter ( packages , fn ( p ) { p . 1 == "latest" } )
233- Model ( .. model , search_input : q , search_packages_filters : packages )
234- |> pair . new ( {
235- case latest {
236- [ ] -> effects . typesense_search ( q , packages )
237- latest -> {
238- latest
239- |> list . map ( pair . first )
240- |> effects . initial_latest_packages
241- }
229+ let packages = {
230+ use # ( package , version ) <- list . map ( packages )
231+ use <- bool . guard (
232+ when : version != "latest" ,
233+ return : version . Package ( package , version , resolved : True ) ,
234+ )
235+ case dict . get ( model . packages_versions , package ) {
236+ Error ( _ ) -> version . Package ( package , version , resolved : False )
237+ Ok ( versions ) -> {
238+ case versions . releases {
239+ [ ] -> version . Package ( package , version , resolved : False )
240+ [ release , .. ] ->
241+ version . Package ( package , release . version , resolved : True )
242242 }
243- } )
243+ }
244244 }
245245 }
246+
247+ let latest = list . filter ( packages , fn ( p ) { p . version == "latest" } )
248+
249+ let model =
250+ Model ( .. model , search_input : q , search_packages_filters : packages )
251+
252+ case latest {
253+ [ ] ->
254+ case string . is_empty ( q ) {
255+ True ->
256+ pair . new ( set_search_results ( model , # ( - 1 , [ ] ) ) , effect . none ( ) )
257+ False -> pair . new ( model , effects . typesense_search ( q , packages ) )
258+ }
259+
260+ latest ->
261+ pair . new (
262+ model ,
263+ latest
264+ |> list . map ( fn ( p ) { p . name } )
265+ |> effects . initial_latest_packages ,
266+ )
267+ }
246268 }
247269 }
248270}
249271
250272pub fn replace_search_packages ( model : Model ) {
251- let model =
252- Model ( .. model , search_packages_filters : {
253- use # ( package , version ) <- list . map ( model . search_packages_filters )
254- use <- bool . guard ( when : version != "latest" , return : # ( package , version ) )
255- case dict . get ( model . packages_versions , package ) {
256- Error ( _ ) -> # ( package , version )
257- Ok ( versions ) -> {
258- case versions . releases {
259- [ ] -> # ( package , version )
260- [ release , .. ] -> # ( package , release . version )
261- }
262- }
263- }
264- } )
265- route . Search ( q : model . search_input , packages : model . search_packages_filters )
273+ model
274+ |> model_to_search
266275 |> route . replace
267276 |> pair . new ( model , _)
268277}
269278
279+ pub fn push_search_packages ( model : Model ) {
280+ # ( model , route . push ( model_to_search ( model ) ) )
281+ }
282+
270283pub fn select_autocomplete_option ( model : Model , package : String ) {
271284 case model . autocomplete , model . route {
272285 None , _ -> model
@@ -326,9 +339,9 @@ pub fn compute_filters_input(model: Model) -> #(Model, Effect(Msg)) {
326339 let search_input = keep_search_input_non_packages_text ( model )
327340 case list . is_empty ( packages_to_fetch ) {
328341 True -> {
329- # ( Model ( .. model , search_packages_filters : filters , search_input : ) , {
330- route . push ( route . Search ( q : search_input , packages : filters ) )
331- } )
342+ let model =
343+ Model ( .. model , search_packages_filters : filters , search_input : )
344+ push_search_packages ( model )
332345 }
333346 False -> # ( model , {
334347 use dispatch <- effect . from ( )
@@ -350,6 +363,15 @@ pub fn compute_filters_input(model: Model) -> #(Model, Effect(Msg)) {
350363 }
351364}
352365
366+ fn model_to_search ( model : Model ) {
367+ route . Search (
368+ q : model . search_input ,
369+ packages : list . map ( model . search_packages_filters , fn ( p ) {
370+ pair . new ( p . name , p . version )
371+ } ) ,
372+ )
373+ }
374+
353375/// Typical home search input will be something like `foo #phoenix #ecto:1.0.0`.
354376/// `extract_packages_filters_or_fetches` will extract the `#ecto:1.0.0` part
355377/// as a filter, and will return a side-effect to fetch `phoenix`, in order to
@@ -358,14 +380,21 @@ pub fn compute_filters_input(model: Model) -> #(Model, Effect(Msg)) {
358380/// correct model and will reroute to the search page.
359381fn extract_packages_filters_or_fetches ( model : Model ) {
360382 let segments = string . split ( model . home_input_displayed , on : " " )
361- let search_packages_filters = list . filter_map ( segments , version . match_package )
383+ let search_packages_filters =
384+ list . filter_map ( segments , version . input_match_package )
362385 list . fold ( search_packages_filters , # ( [ ] , [ ] ) , fn ( acc , val ) {
363386 let # ( filters , packages_to_fetch ) = acc
364387 let # ( package , version ) = val
365388 let is_existing_package = list . contains ( model . packages , package )
366389 use <- bool . guard ( when : ! is_existing_package , return : acc )
367390 case version {
368- Some ( version ) -> # ( [ # ( package , version ) , .. filters ] , packages_to_fetch )
391+ Some ( version ) -> # (
392+ [
393+ version . Package ( name : package , version : version , resolved : True ) ,
394+ .. filters
395+ ] ,
396+ packages_to_fetch ,
397+ )
369398 None -> {
370399 case dict . get ( model . packages_versions , package ) {
371400 Error ( _ ) -> # ( filters , [ package , .. packages_to_fetch ] )
@@ -374,8 +403,14 @@ fn extract_packages_filters_or_fetches(model: Model) {
374403 // That case is impossible, returning the neutral element.
375404 Error ( _ ) -> # ( filters , packages_to_fetch )
376405 Ok ( release ) -> {
377- let version = release . version
378- # ( [ # ( package , version ) , .. filters ] , packages_to_fetch )
406+ let ver = release . version
407+ # (
408+ [
409+ version . Package ( name : package , version : ver , resolved : True ) ,
410+ .. filters
411+ ] ,
412+ packages_to_fetch ,
413+ )
379414 }
380415 }
381416 }
@@ -391,7 +426,7 @@ fn extract_packages_filters_or_fetches(model: Model) {
391426fn keep_search_input_non_packages_text ( model : Model ) -> String {
392427 let segments = string . split ( model . home_input_displayed , on : " " )
393428 segments
394- |> list . filter ( fn ( s ) { version . match_package ( s ) |> result . is_error } )
429+ |> list . filter ( fn ( s ) { version . input_match_package ( s ) |> result . is_error } )
395430 |> string . join ( with : " " )
396431}
397432
0 commit comments