meat/lib/commands/hunt.ml
atagen 703ac28f52
All checks were successful
Nix Build / nix build (push) Successful in 1m1s
refactor, hunt
2026-03-23 22:38:33 +11:00

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