5050 terminalWidth: int
5151 namesWidth: int
5252 flags: set [HelpFlag ]
53+ defaultValueDescs: seq [string ]
5354
5455 CmdInfo = ref object
5556 name: string
7475 idx: int
7576 flags: set [OptFlag ]
7677 hasDefault: bool
77- defaultInHelpText: string
7878 obsoleteMsg: string
7979 case kind: OptKind
8080 of Discriminator :
@@ -194,6 +194,12 @@ template flushOutputAndQuit(exitCode: int) =
194194 flushOutput
195195 quit exitCode
196196
197+ func defaultValueDesc (appInfo: HelpAppInfo , optIdx: int ): string =
198+ if optIdx == - 1 :
199+ " "
200+ else :
201+ appInfo.defaultValueDescs[optIdx]
202+
197203func helpOptDesc (appInfo: HelpAppInfo ): string =
198204 result = " Show this help message and exit"
199205 if appInfo.hasDebugOpts:
@@ -367,7 +373,7 @@ proc describeInvocation(
367373 let cliArg = " <" & arg.name & " >"
368374 helpOutput fgArg, styleBright, cliArg
369375 helpOutput padding (cliArg, appInfo.namesWidth)
370- help.writeDesc appInfo, arg.desc, arg.defaultInHelpText
376+ help.writeDesc appInfo, arg.desc, appInfo. defaultValueDesc ( arg.idx)
371377 help.writeLongDesc appInfo, arg.longDesc
372378 helpOutput " \p "
373379
@@ -410,7 +416,7 @@ proc describeOptionsList(
410416 if opt.desc.len > 0 :
411417 help.writeDesc appInfo,
412418 opt.desc.replace (" %t" , opt.typename),
413- opt.defaultInHelpText
419+ appInfo. defaultValueDesc ( opt.idx)
414420 help.writeLongDesc appInfo, opt.longDesc
415421
416422 helpOutput " \p "
@@ -445,14 +451,16 @@ proc describeOptions(
445451 let helpOpt = OptInfo (
446452 kind: CliSwitch ,
447453 name: " help" ,
448- desc: helpOptDesc (appInfo)
454+ desc: helpOptDesc (appInfo),
455+ idx: - 1
449456 )
450457 describeOptionsList (help, [helpOpt], appInfo, excl)
451458 if appInfo.hasVersion:
452459 let versionOpt = OptInfo (
453460 kind: CliSwitch ,
454461 name: " version" ,
455- desc: " Show program's version and exit"
462+ desc: " Show program's version and exit" ,
463+ idx: - 1
456464 )
457465 describeOptionsList (help, [versionOpt], appInfo, excl)
458466
@@ -828,6 +836,20 @@ proc generateFieldSetters(RecordType: NimNode): NimNode =
828836 defaultValue = field.readPragma " defaultValue"
829837 completerName = ident ($ field.name & " Complete" )
830838 isFieldDiscriminator = newLit field.isDiscriminator
839+ defaultValueDesc = field.readPragma " defaultValueDesc"
840+ defaultValueHelp =
841+ if defaultValueDesc != nil :
842+ defaultValueDesc
843+ elif defaultValue != nil :
844+ defaultValue
845+ else :
846+ newLit (" " )
847+ defaultValueHelpRepr =
848+ if defaultValueDesc == nil and defaultValue != nil :
849+ newLit (repr defaultValue)
850+ else :
851+ newLit (" " )
852+ defaultValueHelpName = ident ($ field.name & " DefaultValueHelp" )
831853
832854 if defaultValue == nil :
833855 defaultValue = newCall (makeDefaultValue, newTree (nnkTypeOfExpr, configField))
@@ -838,9 +860,11 @@ proc generateFieldSetters(RecordType: NimNode): NimNode =
838860
839861 settersArray.add newTree (nnkTupleConstr,
840862 newLit ($ paramName),
841- setterName, completerName,
863+ setterName,
864+ completerName,
842865 newCall (bindSym " requiresInput" , fixedFieldType),
843- newCall (bindSym " acceptsMultipleValues" , fixedFieldType))
866+ newCall (bindSym " acceptsMultipleValues" , fixedFieldType),
867+ defaultValueHelpName)
844868
845869 result .add quote do :
846870 {.push hint [XCannotRaiseY ]: off .}
@@ -870,6 +894,22 @@ proc generateFieldSetters(RecordType: NimNode): NimNode =
870894 else :
871895 setField (`configField`, val, `defaultValue`)
872896
897+ proc `defaultValueHelpName` (): string {.
898+ nimcall
899+ gcsafe
900+ sideEffect
901+ raises : []
902+ .} =
903+ # defaultValue can be `config.otherField` which won't compile
904+ # `$` may not be defined for this type
905+ when compiles ($ `defaultValueHelp`):
906+ when typeof ($ `defaultValueHelp`) is string :
907+ $ `defaultValueHelp`
908+ else :
909+ `defaultValueHelpRepr`
910+ else :
911+ `defaultValueHelpRepr`
912+
873913 result .add quote do :
874914 {.pop .}
875915
@@ -901,11 +941,6 @@ func findPath(parent, node: CmdInfo): seq[CmdInfo] =
901941 doAssert validPath (result , parent, node)
902942 result .add parent
903943
904- func toText (n: NimNode ): string =
905- if n == nil : " "
906- elif n.kind in {nnkStrLit.. nnkTripleStrLit}: n.strVal
907- else : repr (n)
908-
909944func readPragmaFlags (field: FieldDescription ): set [OptFlag ] =
910945 result = {}
911946 if field.readPragma (" hidden" ) != nil :
@@ -927,10 +962,6 @@ proc cmdInfoFromType(T: NimNode): CmdInfo =
927962 let
928963 isImplicitlySelectable = field.readPragma " implicitlySelectable" != nil
929964 defaultValue = field.readPragma " defaultValue"
930- defaultValueDesc = field.readPragma " defaultValueDesc"
931- defaultInHelp = if defaultValueDesc != nil : defaultValueDesc
932- else : defaultValue
933- defaultInHelpText = toText (defaultInHelp)
934965 obsoleteMsg = field.readPragma " obsolete"
935966 separator = field.readPragma " separator"
936967 longDesc = field.readPragma " longDesc"
@@ -948,7 +979,6 @@ proc cmdInfoFromType(T: NimNode): CmdInfo =
948979 name: $ field.name,
949980 flags: optFlags,
950981 hasDefault: defaultValue != nil ,
951- defaultInHelpText: defaultInHelpText,
952982 typename: field.typ.repr)
953983
954984 if desc != nil : opt.desc = desc.strVal
@@ -1290,19 +1320,27 @@ proc loadImpl[C, SecondarySources](
12901320
12911321 return
12921322
1293- proc lazyHelpAppInfo (flags: set [HelpFlag ]): HelpAppInfo =
1323+ proc lazyHelpAppInfo (flags: set [HelpFlag ], defaultValueDescs: seq [ string ] ): HelpAppInfo =
12941324 HelpAppInfo (
12951325 copyrightBanner: copyrightBanner,
12961326 appInvocation: appInvocation (),
12971327 terminalWidth: termWidth,
12981328 hasVersion: version.len > 0 ,
1299- flags: flags
1329+ flags: flags,
1330+ defaultValueDescs: defaultValueDescs
13001331 )
13011332
1333+ template getDefaultValueDescs (): seq [string ] =
1334+ var defaultValueDescs = newSeq [string ](fieldSetters.len)
1335+ for i in 0 ..< fieldSetters.len:
1336+ defaultValueDescs [i] = fieldSetters [i][5 ]()
1337+ defaultValueDescs
1338+
13021339 template processHelpAndVersionOptions (optKey, optVal: string ) =
13031340 let key = optKey
13041341 if cmpIgnoreStyle (key, " help" ) == 0 :
1305- help.showHelp (lazyHelpAppInfo (optVal.toHelpFlags), activeCmds)
1342+ let defaultValueDescs = getDefaultValueDescs ()
1343+ help.showHelp (lazyHelpAppInfo (optVal.toHelpFlags, defaultValueDescs), activeCmds)
13061344 elif version.len > 0 and cmpIgnoreStyle (key, " version" ) == 0 :
13071345 help.helpOutput version, " \p "
13081346 flushOutputAndQuit QuitSuccess
0 commit comments