open Cmdliner let init_cmd = let doc = "Initialize a new lithos database" in let path_arg = let doc = "Path to the database file" in Arg.(required & pos 0 (some string) None & info [] ~docv:"PATH" ~doc) in let page_size_arg = let doc = "Page size in bytes" in Arg.(value & opt int 4096 & info [ "page-size" ] ~docv:"SIZE" ~doc) in let init_fn path page_size = match Lithos.Io.create_database path page_size with | Ok () -> Printf.printf "Database created at %s with page size %d\n" path page_size; 0 | Error err -> Printf.eprintf "Error: %s\n" (Lithos.Error.to_string err); 1 in let info = Cmd.info "init" ~doc in Cmd.v info Term.(const init_fn $ path_arg $ page_size_arg) ;; let info_cmd = let doc = "Display database information" in let path_arg = let doc = "Path to the database file" in Arg.(required & pos 0 (some string) None & info [] ~docv:"PATH" ~doc) in let info_fn path = match Lithos.Io.read_header path with | Ok meta -> Printf.printf "Database: %s\n" path; Printf.printf "Version: %d\n" meta.Lithos.Types.version; Printf.printf "Page size: %d bytes\n" meta.Lithos.Types.page_size; begin match meta.Lithos.Types.root_bucket with | None -> Printf.printf "Root bucket: None\n" | Some id -> Printf.printf "Root bucket: %Ld\n" id end; 0 | Error err -> Printf.eprintf "Error: %s\n" (Lithos.Error.to_string err); 1 in let cmd_info = Cmd.info "info" ~doc in Cmd.v cmd_info Term.(const info_fn $ path_arg) ;; let default_cmd = let doc = "Lithos - An embedded key-value database" in let sdocs = Manpage.s_common_options in let man = [ `S Manpage.s_description ; `P "Lithos is an embedded, transactional key-value database written in OCaml." ; `S Manpage.s_commands ; `S Manpage.s_common_options ; `S Manpage.s_bugs ; `P "Report bugs at https://github.com/desertthunder/lithos/issues" ] in let info = Cmd.info "lithos" ~version:"0.1.0" ~doc ~sdocs ~man in Cmd.group info [ init_cmd; info_cmd ] ;; let () = exit (Cmd.eval' default_cmd)