diff --git a/bin/main.ml b/bin/main.ml index 90f92e7..ed3a049 100644 --- a/bin/main.ml +++ b/bin/main.ml @@ -17,6 +17,10 @@ Usage: inshellah complete CMD [ARGS...] [--db PATH] Nushell custom completer. Outputs JSON completion candidates. Falls back to --help resolution if command is not in the database. + inshellah query CMD [--db PATH] + Print stored completion data for CMD as JSON. + inshellah clear [CMD...] [--db PATH] + Clear the database, or remove specific commands. inshellah dump [--db PATH] Show stats and commands in the database. inshellah manpage FILE Parse a manpage and emit nushell extern @@ -633,6 +637,34 @@ let cmd_complete spans db_path = Printf.printf "[%s]\n" (String.concat "," !candidates)); close db +let cmd_query cmd db_path = + let db = init db_path in + (match lookup db cmd with + | None -> + Printf.eprintf "not found: %s\n" cmd; close db; exit 1 + | Some (data, source) -> + Printf.printf "# source: %s\n%s\n" source data); + close db + +let cmd_clear cmds db_path = + let db = init db_path in + (match cmds with + | [] -> + (match Sqlite3.exec db "DELETE FROM completions" with + | Sqlite3.Rc.OK -> + Printf.printf "cleared all commands from %s\n" db_path + | rc -> + Printf.eprintf "error: %s\n" (Sqlite3.Rc.to_string rc); exit 1) + | _ -> + List.iter (fun cmd -> + if has_command db cmd then begin + delete db cmd; + Printf.printf "removed %s\n" cmd + end else + Printf.eprintf "not found: %s\n" cmd + ) cmds); + close db + let load_ignorelist path = try let ic = open_in path in @@ -669,6 +701,19 @@ let () = | arg :: rest -> parse_complete_args (arg :: spans) db rest in let (spans, db_path) = parse_complete_args [] (default_db_path ()) rest in cmd_complete spans db_path + | "query" :: rest -> + let (cmd, db_path) = match rest with + | [cmd] -> (cmd, default_db_path ()) + | [cmd; "--db"; path] -> (cmd, path) + | _ -> Printf.eprintf "error: query CMD [--db PATH]\n"; exit 1 in + cmd_query cmd db_path + | "clear" :: rest -> + let rec parse_clear_args cmds db = function + | [] -> (List.rev cmds, db) + | "--db" :: path :: rest -> parse_clear_args cmds path rest + | cmd :: rest -> parse_clear_args (cmd :: cmds) db rest in + let (cmds, db_path) = parse_clear_args [] (default_db_path ()) rest in + cmd_clear cmds db_path | "dump" :: rest -> let db_path = match rest with | ["--db"; path] -> path