61 lines
2.4 KiB
OCaml
61 lines
2.4 KiB
OCaml
let es_host = "nixos-search-7-1733963800.us-east-1.bonsaisearch.net"
|
|
|
|
let es_query term =
|
|
Printf.sprintf
|
|
{|{"from":0,"size":20,"sort":[{"_score":"desc","package_attr_name":"desc","package_pversion":"desc"}],"collapse":{"field":"package_attr_name"},"query":{"bool":{"must":[{"term":{"type":"package"}},{"multi_match":{"type":"cross_fields","query":"%s","fields":["package_attr_name^9","package_pname^6","package_description^1.3","package_longDescription^1"]}}]}}}|}
|
|
term
|
|
|
|
let truncate n s = if String.length s > n then String.sub s 0 n ^ ".." else s
|
|
|
|
let run () =
|
|
print_string Common.header;
|
|
let argv_len = Array.length Sys.argv in
|
|
if argv_len < 3 then (
|
|
Common.meat_print "WHAT MEAT ARE YOU HUNTING?";
|
|
print_string Common.footer)
|
|
else
|
|
let query =
|
|
Array.sub Sys.argv 2 (argv_len - 2)
|
|
|> Array.to_list |> String.concat " "
|
|
in
|
|
Common.meat_print ("HUNTING FOR " ^ Common.all_caps query ^ "..");
|
|
let body = es_query query in
|
|
let path = "/nixos-*-unstable-*/_search" in
|
|
(try
|
|
let resp = Http.https_post ~host:es_host ~path ~body in
|
|
let json = Json.parse_json resp in
|
|
let hits =
|
|
match Option.bind (Json.jfield "hits" json) (fun h -> Json.jfield "hits" h) with
|
|
| Some (`List items) -> items
|
|
| _ -> []
|
|
in
|
|
if hits = [] then
|
|
Common.meat_print "NO MEATS FOUND!"
|
|
else
|
|
List.iter
|
|
(fun hit ->
|
|
let src =
|
|
match Json.jfield "_source" hit with Some s -> s | None -> `Null
|
|
in
|
|
let name =
|
|
match Option.bind (Json.jfield "package_attr_name" src) Json.jstring with
|
|
| Some s -> s
|
|
| None -> "?"
|
|
in
|
|
let version =
|
|
match Option.bind (Json.jfield "package_pversion" src) Json.jstring with
|
|
| Some s -> s
|
|
| None -> ""
|
|
in
|
|
let desc =
|
|
match Option.bind (Json.jfield "package_description" src) Json.jstring with
|
|
| Some s -> truncate 60 s
|
|
| None -> ""
|
|
in
|
|
let ver_str = if version <> "" then " (" ^ version ^ ")" else "" in
|
|
Printf.printf " \tnixpkgs#%s%s\n" name ver_str;
|
|
if desc <> "" then Printf.printf " \t %s\n" desc)
|
|
hits
|
|
with e ->
|
|
Common.meat_print ("HUNT FAILED: " ^ Printexc.to_string e));
|
|
print_string Common.footer
|