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