module Cmdline

type Cmdline = {
    Inputs: string list
    Output: string
    Roots:  string list
}

let private exeName = System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName

let private usage () =
    printfn "usage: %s inputfile [inputfile2..] outputfile :keepclass [:keepclass2..]" exeName
    printfn "Merges one or more input JARs into one output JAR, while pruning unreferenced classes."
    None

let private parseArgsList (args: string list) =
    let (classes, args) = args |> List.partition (fun arg -> arg.Length > 1 && arg.StartsWith ":")
    let (files, args) = args |> List.partition (fun arg -> arg.Length > 0 && not (arg.StartsWith ":"))
    if files.Length >= 2 && classes.Length >= 1 && args.Length = 0
    then Some { Inputs = List.take (files.Length - 1) files
                Output = List.last files
                Roots = classes |> List.map (fun arg -> arg.Substring 1)
              }
    else usage()

let print format =
    Printf.ksprintf (fun msg -> printfn "%s: %s" exeName msg) format

let parse args =
    if isNull args then usage ()
    else Array.toList args |> parseArgsList