Skip to content

Commit 5537799

Browse files
committed
WIP
1 parent 741579a commit 5537799

File tree

4 files changed

+74
-38
lines changed

4 files changed

+74
-38
lines changed

src/hexdocs.gleam

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ fn update(model: Model, msg: Msg) {
5050
msg.ApiReturnedPackages(response) -> api_returned_packages(model, response)
5151
msg.ApiReturnedTypesenseSearch(response) ->
5252
api_returned_typesense_search(model, response)
53-
msg.ApiReturnedInitialLatestPackages(versions) ->
54-
api_returned_initial_latest_packages(model, versions)
53+
msg.ApiReturnedInitialLatestPackages(packages, versions) ->
54+
api_returned_initial_latest_packages(model, packages, versions)
5555

5656
msg.DocumentChangedLocation(location:) ->
5757
model.update_route(model, location)
@@ -166,14 +166,14 @@ fn api_returned_typesense_search(model: Model, response: Loss(decode.Dynamic)) {
166166

167167
fn api_returned_initial_latest_packages(
168168
model: Model,
169+
packages: List(String),
169170
versions: Loss(List(hexpm.Package)),
170-
) -> #(Model, Effect(a)) {
171+
) {
171172
case versions {
172-
Error(_) -> model.replace_search_packages(model)
173-
Ok(versions) ->
174-
model.add_packages_versions(model, versions)
175-
|> model.replace_search_packages
173+
Error(_) -> model.add_missing_packages(model, packages)
174+
Ok(versions) -> model.add_packages_versions(model, versions)
176175
}
176+
|> model.replace_search_packages
177177
}
178178

179179
fn document_registered_event_listener(model: Model, unsubscriber: fn() -> Nil) {
@@ -310,10 +310,8 @@ fn user_clicked_go_back(model: Model) -> #(Model, Effect(msg)) {
310310
fn user_submitted_packages_filter(model: Model) {
311311
let package = model.search_packages_filter_input
312312
let version = model.search_packages_filter_version_input
313-
model.packages_versions
314-
|> dict.get(package)
315-
|> result.map(fn(package) { package.releases })
316-
|> result.try(list.find(_, fn(r) { r.version == version }))
313+
314+
model.find_matching_package_version(model, package, version)
317315
|> result.map(fn(_) {
318316
let search_packages_filters =
319317
[version.Package(name: package, version: version, resolved: True)]
@@ -371,7 +369,12 @@ fn user_selected_package_filter_version(model: Model) {
371369
let releases =
372370
model.packages_versions
373371
|> dict.get(package)
374-
|> result.map(fn(p) { p.releases })
372+
|> result.try(fn(maybe_package) {
373+
case maybe_package {
374+
None -> Error(Nil)
375+
Some(package) -> Ok(package.releases)
376+
}
377+
})
375378
|> result.unwrap([])
376379
let release =
377380
releases

src/hexdocs/data/model.gleam

Lines changed: 54 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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

132143
pub 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)

src/hexdocs/data/msg.gleam

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ pub type Msg {
1010
ApiReturnedPackages(Loss(String))
1111
ApiReturnedTypesenseSearch(Loss(Dynamic))
1212
ApiReturnedPackagesVersions(packages: Loss(List(hexpm.Package)))
13-
ApiReturnedInitialLatestPackages(versions: Loss(List(hexpm.Package)))
13+
ApiReturnedInitialLatestPackages(
14+
packages: List(String),
15+
versions: Loss(List(hexpm.Package)),
16+
)
1417

1518
// Application messages.
1619
DocumentChangedLocation(location: uri.Uri)

src/hexdocs/effects.gleam

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ pub fn initial_latest_packages(packages: List(String)) {
4545
}
4646
}
4747
}
48-
dispatch(msg.ApiReturnedInitialLatestPackages(versions:))
48+
dispatch(msg.ApiReturnedInitialLatestPackages(packages:, versions:))
4949
}
5050

5151
pub fn subscribe_blurred_search() {

0 commit comments

Comments
 (0)