kilo/vendor/sigs.k8s.io/controller-tools/pkg/genall/help/pretty/help.go
leonnicolas 36643b77b4
Use apiextension v1
- upgrade from apiextension v1beta1 to v1
 - generate yaml manifest for crd intead of applying it at runtime
  - users will have to apply the manifest with kubectl
 - kg and kgctl log an error if the crd is not present
 - now validation should actually work

Signed-off-by: leonnicolas <leonloechner@gmx.de>
2021-06-14 12:59:33 +02:00

172 lines
4.7 KiB
Go

package pretty
import (
"fmt"
"io"
"sigs.k8s.io/controller-tools/pkg/genall/help"
"github.com/fatih/color"
)
var (
headingStyle = Decoration(*color.New(color.Bold, color.Underline))
markerNameStyle = Decoration(*color.New(color.Bold))
fieldSummaryStyle = Decoration(*color.New(color.FgGreen, color.Italic))
markerTargetStyle = Decoration(*color.New(color.Faint))
fieldDetailStyle = Decoration(*color.New(color.Italic, color.FgGreen))
deprecatedStyle = Decoration(*color.New(color.CrossedOut))
)
// MarkersSummary returns a condensed summary of help for the given markers.
func MarkersSummary(groupName string, markers []help.MarkerDoc) Span {
out := new(SpanWriter)
out.Print(Text("\n"))
out.Print(headingStyle.Containing(Text(groupName)))
out.Print(Text("\n\n"))
table := &Table{Sizing: &TableCalculator{Padding: 2}}
for _, marker := range markers {
table.StartRow()
table.Column(MarkerSyntaxHelp(marker))
table.Column(markerTargetStyle.Containing(Text(marker.Target)))
summary := new(SpanWriter)
if marker.DeprecatedInFavorOf != nil && len(*marker.DeprecatedInFavorOf) > 0 {
summary.Print(markerNameStyle.Containing(Text("(use ")))
summary.Print(markerNameStyle.Containing(Text(*marker.DeprecatedInFavorOf)))
summary.Print(markerNameStyle.Containing(Text(") ")))
}
summary.Print(Text(marker.Summary))
table.Column(summary)
table.EndRow()
}
out.Print(table)
out.Print(Text("\n"))
return out
}
// MarkersDetails returns detailed help for the given markers, including detailed field help.
func MarkersDetails(fullDetail bool, groupName string, markers []help.MarkerDoc) Span {
out := new(SpanWriter)
out.Print(Line(headingStyle.Containing(Text(groupName))))
out.Print(Newlines(2))
for _, marker := range markers {
out.Print(Line(markerName(marker)))
out.Print(Text(" "))
out.Print(markerTargetStyle.Containing(Text(marker.Target)))
summary := new(SpanWriter)
if marker.DeprecatedInFavorOf != nil && len(*marker.DeprecatedInFavorOf) > 0 {
summary.Print(markerNameStyle.Containing(Text("(use ")))
summary.Print(markerNameStyle.Containing(Text(*marker.DeprecatedInFavorOf)))
summary.Print(markerNameStyle.Containing(Text(") ")))
}
summary.Print(Text(marker.Summary))
if !marker.AnonymousField() {
out.Print(Indented(1, Line(summary)))
if len(marker.Details) > 0 && fullDetail {
out.Print(Indented(1, Line(Text(marker.Details))))
}
}
if marker.AnonymousField() {
out.Print(Indented(1, Line(fieldDetailStyle.Containing(FieldSyntaxHelp(marker.Fields[0])))))
out.Print(Text(" "))
out.Print(summary)
if len(marker.Details) > 0 && fullDetail {
out.Print(Indented(2, Line(Text(marker.Details))))
}
out.Print(Newlines(1))
} else if !marker.Empty() {
out.Print(Newlines(1))
if fullDetail {
for _, arg := range marker.Fields {
out.Print(Indented(1, Line(fieldDetailStyle.Containing(FieldSyntaxHelp(arg)))))
out.Print(Indented(2, Line(Text(arg.Summary))))
if len(arg.Details) > 0 && fullDetail {
out.Print(Indented(2, Line(Text(arg.Details))))
out.Print(Newlines(1))
}
}
out.Print(Newlines(1))
} else {
table := &Table{Sizing: &TableCalculator{Padding: 2}}
for _, arg := range marker.Fields {
table.StartRow()
table.Column(fieldDetailStyle.Containing(FieldSyntaxHelp(arg)))
table.Column(Text(arg.Summary))
table.EndRow()
}
out.Print(Indented(1, table))
}
} else {
out.Print(Newlines(1))
}
}
return out
}
func FieldSyntaxHelp(arg help.FieldHelp) Span {
return fieldSyntaxHelp(arg, "")
}
// fieldSyntaxHelp prints the syntax help for a particular marker argument.
func fieldSyntaxHelp(arg help.FieldHelp, sep string) Span {
if arg.Optional {
return FromWriter(func(out io.Writer) error {
_, err := fmt.Fprintf(out, "[%s%s=<%s>]", sep, arg.Name, arg.TypeString())
return err
})
}
return FromWriter(func(out io.Writer) error {
_, err := fmt.Fprintf(out, "%s%s=<%s>", sep, arg.Name, arg.TypeString())
return err
})
}
// markerName returns a span containing just the appropriately-formatted marker name.
func markerName(def help.MarkerDoc) Span {
if def.DeprecatedInFavorOf != nil {
return deprecatedStyle.Containing(Text("+" + def.Name))
}
return markerNameStyle.Containing(Text("+" + def.Name))
}
// MarkerSyntaxHelp assembles syntax help for a given marker.
func MarkerSyntaxHelp(def help.MarkerDoc) Span {
out := new(SpanWriter)
out.Print(markerName(def))
if def.Empty() {
return out
}
sep := ":"
if def.AnonymousField() {
sep = ""
}
fieldStyle := fieldSummaryStyle
if def.DeprecatedInFavorOf != nil {
fieldStyle = deprecatedStyle
}
for _, arg := range def.Fields {
out.Print(fieldStyle.Containing(fieldSyntaxHelp(arg, sep)))
sep = ","
}
return out
}