From a7823fc059de2de007a5ac14cf6ae81269ba5a7f Mon Sep 17 00:00:00 2001 From: Johann150 Date: Sat, 10 Jun 2023 11:20:02 +0200 Subject: [PATCH] refactor lookups to separate functions This allows them to be used separately. --- src/bahnhofname.gleam | 63 ++++++++++++++++++++++++++----------------- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/src/bahnhofname.gleam b/src/bahnhofname.gleam index d331b64..d75a8f6 100644 --- a/src/bahnhofname.gleam +++ b/src/bahnhofname.gleam @@ -86,35 +86,40 @@ fn unpercent(encoded: String) -> String { res } -fn the_lookup( +/// Looks up a query in a Map by exact value, no fuzzy matching. +fn lookup_exact(query: String, lookup: Map(String, String)) -> #(Int, String) { + case map.get(lookup, query) { + Ok(result) -> #(200, result) + _ -> #(404, "??") + } +} + +/// Looks up a station by its name, with fuzzy matching. +fn lookup_by_name( query: String, stations: Map(String, String), ds100s: Map(String, String), fuzzy: fn(String) -> List(String) ) -> #(Int, String) { - case map.get(ds100s, query) { - Ok(name) -> #(200, name) + io.println(query) + + case map.get(stations, query) { + Ok(ds100) -> #(200, ds100) _ -> { - io.println(query) - case map.get(stations, query) { - Ok(ds100) -> #(200, ds100) - _ -> { - let results = fuzzy(query) - |> list.filter_map(fn (res) { map.get(ds100s, string.uppercase(res)) }) - case results { - // results -> { - // let names = results - // |> list.map (fn (res) { - // map.get(ds100s, string.uppercase(res)) - // |> result.map(fn(a) { "/" <> a }) - // |> result.unwrap("/")}) - // #(200, string.join(names, "\n")) - // } - [res] -> #(302, res) - [res, ..] -> #(302, res) - _ -> #(404, "??") - } - } + let results = fuzzy(query) + |> list.filter_map(fn (res) { map.get(ds100s, string.uppercase(res)) }) + case results { + // results -> { + // let names = results + // |> list.map (fn (res) { + // map.get(ds100s, string.uppercase(res)) + // |> result.map(fn(a) { "/" <> a }) + // |> result.unwrap("/")}) + // #(200, string.join(names, "\n")) + // } + [res] -> #(302, res) + [res, ..] -> #(302, res) + _ -> #(404, "??") } } } @@ -135,8 +140,16 @@ fn lookup_station( 200, "ds100 → Name: " <> baseurl <> "/NN\n" <> "Name → ds100: " <> baseurl <> "/Nürnberg Hbf", ) - Request(method: Get, path: "/" <> path, ..) -> - the_lookup(unpercent(path), stations, ds100s, fuzzy) + Request(method: Get, path: "/" <> path, ..) -> { + let path = unpercent(path) + + let by_ds100 = lookup_exact(path, ds100s) + + case by_ds100.0 { + 200 -> by_ds100 + _ -> lookup_by_name(path, stations, ds100s, fuzzy) + } + } _ -> #(404, "intended usage is e.g. curl " <> baseurl <> "/FF") } let body = bit_builder.from_string(text)