module S = Seed.DataStructures.StringMap; open Components; // TODO(antons): this is quite ugly, for positionals only // instead of showing <..positionals> show the alias // revisit how positionals conig is stored, // there are too many implicit checks with ==ArgsMap.positionalsKey let getArgLabel = (name, alias) => { switch (name == ArgsMap.positionalsKey, alias) { | (false, _) | (true, None) => name | (true, Some(name)) => name }; }; module ArgTypeSignature = { let createElement = (~arg: Args.t, ~children as _, ()) => { let (open_, close) = switch (arg.kind) { | Req => ("<", ">") | Opt => ("[", "]") | OptDefault(default) => ("[", "]=" ++ default) }; let labelModifier = switch (arg.possibleValues) { | ZeroOrOne => "" | One => "" | Many => ".." }; let choices = switch (arg.choices) { | None => "" | Some(choices) => switch (choices) { | HelpAndSuggestions(xs) => " " ++ String.concat(", ", xs) | Suggestions(_) | Dynamic(_) => "" } }; open_ labelModifier {arg.type_} close choices ; }; }; module ArgsSignatures = { let argLabel = (name, alias) => switch (name == ArgsMap.positionalsKey, alias) { | (false, None) => name | (false, Some(alias)) => name ++ " " ++ alias ++ "" | (true, None) => name | (true, Some(name)) => name }; let createElement = (~args, ~children as _, ()) => List.map( (arg: Args.t) => ( argLabel(arg.name, arg.alias), arg.doc ++ " " ++ , ), args, ) |> tupleLines(_) |> String.concat("\n"); }; module Positionals = { let createElement = (~item: option(Args.t), ~children as _, ()) => switch (item) { | None => "" | Some(arg) => "Positionals:" }; }; module ArgNameSignature = { let createElement = ( ~label: string, ~kind: Args.kind, ~possibleValues: Args.possibleValues, ~children as _, (), ) => { let (open_, close) = switch (kind) { | Req => ("<", ">") | Opt => ("[", "]") | OptDefault(default) => ("[", "]=" ++ default) }; let labelModifier = switch (possibleValues) { | ZeroOrOne => "" | One => "" | Many => ".." }; open_ labelModifier label close ; }; }; module Options = { let createElement = (~items, ~children as _, ()) => switch (items) { | [] => "" | args => "Options:" }; }; module CommandSignatureBase = { let createElement = ( ~appName: string, ~hasSubCommands: bool, ~positionals: option(Args.t), ~options: list(Args.t), ~children as _, (), ) => { let optionsStr = switch (options) { | [] => "" | [option] => switch (option.kind) { | Req => " " | Opt | OptDefault(_) => " [options]" } | options => let hasRequired = List.exists( (o: Args.t) => switch (o.kind) { | Req => true | Opt => false | OptDefault(_) => false }, options, ); hasRequired ? " <..options>" : " [..options]"; }; let subCommand = hasSubCommands ? isSome(positionals) || List.length(options) > 0 ? " [sub-command]" : " " : " "; appName subCommand {renderIfSome(positionals, p => )} optionsStr ; }; }; module InternalCommandSignature = { let createElement = ( ~appName, ~hasSubCommands, ~positionals: option(Args.t), ~options: list(Args.t), ~marginBottom=?, ~children as _, (), ) => { "Command signature:" ; }; }; module CommandSignature = { let createElement = (~cmd: CmdInternal.t('a), ~children as _, ()) => { let (positionals, options) = Args.splitPositionalsAndOptionArgs(cmd.args); ; }; }; module Commands = { let createElement = (~items, ~marginBottom=?, ~children as _, ()) => switch (items) { | None => "" | Some(children) => let content = List.map( ((name, cmd): (string, CmdInternal.t('a))) => (name, cmd.name), S.entries(children), ) |> tupleLines(_) |> String.concat("\n"); "Sub-Commands:" content ; }; }; module Help = { let createElement = (~cmd: CmdInternal.t('a), ~appName: string, ~children as _, ()) => { let (positionals, options) = Args.splitPositionalsAndOptionArgs(cmd.args); {cmd.name} {renderIfSome(cmd.doc, doc => doc )} ; }; };