diff --git a/.mise.toml b/.mise.toml new file mode 100644 index 0000000..b0ad5ab --- /dev/null +++ b/.mise.toml @@ -0,0 +1,23 @@ +[tools] +go = "1.23" + +[env] +BIN="asciiban" + +[tasks.build] +alias = "b" +run = "go build -o ./bin/${BIN}" + +[tasks.generate] +alias = "g" +run = "go generate ./..." + +[tasks.output_readme_screens] +depends = ["b"] +alias = "ors" +run = """ +bin/${BIN} "america" -p patriot -f dosrebel +bin/${BIN} "what is real?" -p matrix -f georgia11 +bin/${BIN} "Google" -p google -f univers +bin/${BIN} "Good yard" -f crazy -p retro +""" diff --git a/animate/animate.go b/animate/animate.go new file mode 100644 index 0000000..c7ecb7b --- /dev/null +++ b/animate/animate.go @@ -0,0 +1,242 @@ +package animate + +import ( + "context" + "fmt" + "io" + "math" + "strings" + "time" + + "github.com/gosuri/uilive" + "github.com/socialviolation/asciiban/ascii" +) + +type Sequence struct { + XPadding int + YPadding int + Frames []Frame +} + +type Frame struct { + XOffset int + YOffset int + Duration time.Duration + Opts []ascii.BannerOption +} + +var blink = Sequence{ + Frames: []Frame{ + { + Duration: 500 * time.Millisecond, + Opts: []ascii.BannerOption{ + ascii.WithPalette(ascii.PaletteBlack), + }, + }, { + Duration: 500 * time.Millisecond, + Opts: []ascii.BannerOption{ + ascii.WithPalette(ascii.PaletteWhite), + }, + }, + }, +} + +var anaglygh = Sequence{ + XPadding: 2, + YPadding: 0, + Frames: []Frame{ + { + XOffset: -1, + Duration: 30 * time.Millisecond, + Opts: []ascii.BannerOption{ + ascii.WithPalette(ascii.PaletteRed), + }, + }, + { + XOffset: 1, + Duration: 30 * time.Millisecond, + Opts: []ascii.BannerOption{ + ascii.WithPalette(ascii.PaletteCyan), + }, + }, + }, +} + +var glitch = Sequence{ + XPadding: 2, + YPadding: 3, + Frames: []Frame{ + { + Duration: 3 * time.Second, + Opts: []ascii.BannerOption{}, + }, + { + XOffset: 1, + Duration: 100 * time.Millisecond, + Opts: []ascii.BannerOption{ + ascii.WithPalette(ascii.PaletteLime), + ascii.WithFont(ascii.FontTheEdge), + }, + }, + { + XOffset: 1, + YOffset: 1, + Duration: 100 * time.Millisecond, + Opts: []ascii.BannerOption{ + ascii.WithPalette(ascii.PaletteMatrixGreen), + ascii.WithFont(ascii.FontTheEdge), + }, + }, + { + XOffset: -1, + YOffset: 0, + Duration: 100 * time.Millisecond, + Opts: []ascii.BannerOption{ + ascii.WithPalette(ascii.PaletteRed), + ascii.WithFont(ascii.FontElite), + }, + }, + { + XOffset: 2, + YOffset: -1, + Duration: 100 * time.Millisecond, + Opts: []ascii.BannerOption{ + ascii.WithPalette(ascii.PaletteMintGreen), + ascii.WithFont(ascii.FontElite), + }, + }, + { + XOffset: 0, + YOffset: -1, + Duration: 100 * time.Millisecond, + Opts: []ascii.BannerOption{ + ascii.WithPalette(ascii.PaletteIceBlue), + ascii.WithFont(ascii.FontElite), + }, + }, + { + XOffset: 2, + YOffset: 0, + Duration: 100 * time.Millisecond, + Opts: []ascii.BannerOption{ + ascii.WithPalette(ascii.PaletteRed), + ascii.WithFont(ascii.FontBloody), + }, + }, + { + XOffset: 0, + YOffset: 1, + Duration: 100 * time.Millisecond, + Opts: []ascii.BannerOption{ + ascii.WithPalette(ascii.PaletteRetroIcyPole), + ascii.WithFont(ascii.FontBloody), + }, + }, + { + XOffset: -2, + YOffset: -1, + Duration: 100 * time.Millisecond, + Opts: []ascii.BannerOption{ + ascii.WithPalette(ascii.PaletteRedBlack), + ascii.WithFont(ascii.FontDOSRebel), + }, + }, + { + XOffset: -3, + YOffset: -1, + Duration: 100 * time.Millisecond, + Opts: []ascii.BannerOption{ + ascii.WithPalette(ascii.PalettePatriot), + ascii.WithFont(ascii.FontDOSRebel), + }, + }, + }, +} + +var styleMap = map[string]Sequence{ + "3d": anaglygh, + "anaglyph": anaglygh, + "blink": blink, + "default": blink, + "glitch": glitch, +} + +func GetSequence(s string) Sequence { + if val, ok := styleMap[s]; ok { + return val + } + fmt.Println("Sequence not found, using default (glitch)") + return GetSequence("default") +} + +func Animate(ctx context.Context, seq Sequence, opts ...ascii.BannerOption) { + maxLines := 0 + for _, f := range seq.Frames { + frameOpts := append(opts, f.Opts...) + banner := ascii.Render(frameOpts...) + lh := strings.Count(banner, "\n") + (seq.YPadding * 2) + f.YOffset + if lh > maxLines { + maxLines = lh + } + } + + draw := func(w io.Writer, f Frame) { + frameOpts := append(opts, f.Opts...) + banner := ascii.Render(frameOpts...) + banner = pad(seq.XPadding, seq.YPadding, f.XOffset, f.YOffset, banner) + lh := strings.Count(banner, "\n") + buffer := int(math.Max(float64(maxLines-lh), 0)) + if lh > 0 { + banner += strings.Repeat("\n", buffer) + } + _, err := fmt.Fprintf(w, banner) + if err != nil { + fmt.Println(err) + return + } + } + + writer := uilive.New() + writer.Start() + defer writer.Stop() + + frameIdx := 0 + ticker := time.NewTicker(seq.Frames[frameIdx].Duration) + defer ticker.Stop() + + draw(writer, seq.Frames[frameIdx]) + go func() { + for { + select { + case <-ctx.Done(): + return + case <-ticker.C: + frameIdx = (frameIdx + 1) % len(seq.Frames) + ticker.Reset(seq.Frames[frameIdx].Duration) + draw(writer, seq.Frames[frameIdx]) + err := writer.Flush() + if err != nil { + fmt.Println("err during writer flush: ", err) + } + } + } + }() + + <-ctx.Done() +} + +func pad(xPad int, yPad int, xOff int, yOff int, rdr string) string { + if xPad+xOff > 0 { + xStr := strings.Repeat(" ", xPad+xOff) + rdr = xStr + rdr + rdr = strings.ReplaceAll(rdr, "\n", "\n"+xStr) + } + + if yPad+yOff >= 0 && yPad-yOff >= 0 { + yPre := strings.Repeat("\n", yPad+yOff) + ySuf := strings.Repeat("\n", yPad-yOff) + rdr = yPre + rdr + ySuf + } + + return rdr +} diff --git a/ascii/banner.go b/ascii/banner.go index 871881b..fe478a3 100644 --- a/ascii/banner.go +++ b/ascii/banner.go @@ -5,45 +5,118 @@ package ascii import "fmt" type Args struct { - Message string - Font string - Palette Palette - ColourMode ColourMode - Trim bool - Verbose bool + message string + font string + palette Palette + colourMode ColourMode + trim bool + verbose bool } -var DefaultArgs = Args{ - Message: "ascii banner", - Font: FontANSIShadow, - Palette: PaletteDefault, +type BannerOption func(*Args) + +func WithMessage(m string) BannerOption { + return func(args *Args) { + args.message = m + } +} + +func WithFont(f string) BannerOption { + return func(args *Args) { + args.font = MatchFont(f) + } +} + +func WithPaletteName(p string) BannerOption { + return func(args *Args) { + args.palette = GetPalette(p) + } +} +func WithPalette(p Palette) BannerOption { + return func(args *Args) { + args.palette = p + } +} + +func WithColourModeName(c string) BannerOption { + return func(args *Args) { + args.colourMode = GetColourMode(c) + } +} + +func WithColourMode(m ColourMode) BannerOption { + return func(args *Args) { + args.colourMode = m + } +} + +func WithTrim(trim bool) BannerOption { + return func(args *Args) { + args.trim = trim + } } -func Print(args Args) { - if args.Font == "" { - args.Font = "default" +func WithVerbose(verbose bool) BannerOption { + return func(args *Args) { + args.verbose = verbose + } +} + +var ( + message = "asciiban" +) + +func buildArgs(opts ...BannerOption) *Args { + args := &Args{} + for _, opt := range opts { + opt(args) } - if args.Palette.IsEmpty() { - args.Palette = White + if args.font == "" { + args.font = "default" + } + if args.palette.IsEmpty() { + args.palette = PaletteWhite + } + if args.message == "" { + args.message = message + } + + return args +} + +func Draw(opts ...BannerOption) { + args := buildArgs(opts...) + + flf, err := loadFont(args.font) + if err != nil { + panic(err) } + flf.Draw(*args) +} + +func Render(opts ...BannerOption) string { + args := buildArgs(opts...) - flf, err := loadFont(args.Font) + flf, err := loadFont(args.font) if err != nil { panic(err) } - flf.Render(args) + return flf.Render(*args) } -func Random(args Args) { - args.Font = pickKeyFromMap(fontMap) - args.Palette = pickValueFromMap(ProfileMap) - flf, err := loadFont(args.Font) +func Random(opts ...BannerOption) { + args := buildArgs(opts...) + + args.font = pickKeyFromMap(fontMap) + args.palette = pickValueFromMap(PaletteMap) + flf, err := loadFont(args.font) if err != nil { panic(err) } - if args.Verbose { - fmt.Printf("Font: %s, \nPalette: %s (%s)\n", args.Font, args.Palette.Name, args.Palette.Key) + if args.verbose { + fmt.Printf("font: %s, \nPalette: %s (%s)\n", args.font, args.palette.Name, args.palette.Key) } - flf.Render(args) + + flf.Render(*args) } diff --git a/ascii/flf.go b/ascii/flf.go index 89ca018..456da4b 100644 --- a/ascii/flf.go +++ b/ascii/flf.go @@ -5,12 +5,13 @@ import ( "compress/gzip" "errors" "fmt" - "github.com/gookit/color" "io" "math" "math/rand" "strconv" "strings" + + "github.com/gookit/color" ) type font struct { @@ -136,45 +137,47 @@ func makeRange(min, max int) []int { return a } -func (f *font) Render(a Args) { - cMode := a.ColourMode +func (f *font) Draw(a Args) { + fmt.Print(f.Render(a)) +} + +func (f *font) Render(a Args) string { + cMode := a.colourMode if cMode == modeNil { - cMode = a.Palette.ColourMode + cMode = a.palette.ColourMode } var preRenderModes = []ColourMode{modeLetter} var postRenderModes = []ColourMode{modeSingle, modeAlternate, modeVerticalGradient, modeHorizontalGradient, modePatriot} - letterList := f.getLetters(a.Message) + letterList := f.getLetters(a.message) if contains(preRenderModes, cMode) { switch cMode { case modeLetter: - letterList = f.letterMode(a.Palette, letterList) + letterList = f.letterMode(a.palette, letterList) break } - renderedMsg := f.renderLetters(letterList) - fmt.Println(renderedMsg) + r := f.renderLetters(letterList) + return strings.Trim(r, "\n") } else if contains(postRenderModes, cMode) { renderedMsg := f.renderLetters(letterList) + renderedMsg = strings.Trim(renderedMsg, "\n") switch cMode { case modeSingle: - f.singleColour(a.Palette, renderedMsg) - return + return f.singleColour(a.palette, renderedMsg) case modeAlternate: - f.alternatingColours(a.Palette, renderedMsg) - return + return f.alternatingColours(a.palette, renderedMsg) case modeVerticalGradient: - f.verticalGradient(a.Palette, renderedMsg) - return + return f.verticalGradient(a.palette, renderedMsg) case modeHorizontalGradient: - f.horizontalGradient(a.Palette, renderedMsg) - return + return f.horizontalGradient(a.palette, renderedMsg) case modePatriot: - f.usaMode(renderedMsg) - return + return f.usaMode(renderedMsg) } } + + return "" } func (f *font) getLetters(message string) [][]string { @@ -209,31 +212,38 @@ func (f *font) renderLetters(letterList [][]string) string { return filteredLines } -func (f *font) singleColour(p Palette, msg string) { - color.HEX(p.Colours[0]).Println(msg) +func (f *font) singleColour(p Palette, msg string) string { + return color.HEX(p.Colours[0]).Sprintf("%s\n", msg) } -func (f *font) alternatingColours(p Palette, msg string) { +func (f *font) alternatingColours(p Palette, msg string) string { + res := "" lines := strings.Split(msg, "\n") for i, l := range lines { n := i % len(p.Colours) if n >= len(p.Colours) { n = 0 } - color.HEX(p.Colours[n]).Println(l) + res += color.HEX(p.Colours[n]).Sprintf("%s\n", l) } + + return res } -func (f *font) verticalGradient(p Palette, msg string) { +func (f *font) verticalGradient(p Palette, msg string) string { + res := "" lines := strings.Split(msg, "\n") palLen := len(p.Colours) for i, l := range lines { ind := translateLERP(len(lines), palLen, i) - color.HEX(p.Colours[ind]).Println(l) + res += color.HEX(p.Colours[ind]).Sprintf("%s\n", l) } + + return res } -func (f *font) horizontalGradient(p Palette, msg string) { +func (f *font) horizontalGradient(p Palette, msg string) string { + res := "" lines := strings.Split(msg, "\n") longest := getLongestString(lines) chunkSize := (longest / len(p.Colours)) + 1 @@ -243,13 +253,15 @@ func (f *font) horizontalGradient(p Palette, msg string) { } lineChunks := sliceIntoChunks(l, chunkSize) for c := 0; c < len(lineChunks); c++ { - color.HEX(p.Colours[c]).Print(lineChunks[c]) + res += color.HEX(p.Colours[c]).Sprint(lineChunks[c]) } - fmt.Println() + res += "\n" } + + return res } -func (f *font) usaMode(msg string) { +func (f *font) usaMode(msg string) string { lines := strings.Split(msg, "\n") renderStr := "" redLineIdx := -1 @@ -290,7 +302,7 @@ func (f *font) usaMode(msg string) { renderStr += "\n" } - fmt.Println(renderStr) + return renderStr } func (f *font) letterMode(p Palette, letters [][]string) [][]string { diff --git a/ascii/fontpack/koholint.flf.gz b/ascii/fontpack/koholint.flf.gz new file mode 100644 index 0000000..c169787 Binary files /dev/null and b/ascii/fontpack/koholint.flf.gz differ diff --git a/ascii/fontpack/kompaktblk.flf.gz b/ascii/fontpack/kompaktblk.flf.gz new file mode 100644 index 0000000..017d9c2 Binary files /dev/null and b/ascii/fontpack/kompaktblk.flf.gz differ diff --git a/ascii/fontpack/sixfo.flf.gz b/ascii/fontpack/sixfo.flf.gz new file mode 100644 index 0000000..19daa83 Binary files /dev/null and b/ascii/fontpack/sixfo.flf.gz differ diff --git a/ascii/fontpack/stencil.flf.gz b/ascii/fontpack/stencil.flf.gz new file mode 100644 index 0000000..4acb65f Binary files /dev/null and b/ascii/fontpack/stencil.flf.gz differ diff --git a/ascii/fontpack/ublk.flf.gz b/ascii/fontpack/ublk.flf.gz new file mode 100644 index 0000000..088c83f Binary files /dev/null and b/ascii/fontpack/ublk.flf.gz differ diff --git a/ascii/fonts.go b/ascii/fonts.go index 0d8a5aa..42daa4c 100644 --- a/ascii/fonts.go +++ b/ascii/fonts.go @@ -1,5 +1,5 @@ // Package ascii Code generated by go generate; DO NOT EDIT. -// This file was generated by robots at 2023-08-24 11:44:30.661727 +1000 AEST m=+1.368358167 +// This file was generated by robots at 2024-09-13 12:06:09.319441 +1000 AEST m=+2.626579876 // using data from https://github.com/xero/figlet-fonts //go:build !exclude @@ -12,6 +12,10 @@ import ( "strings" ) +func init() { + fontCache = make(map[string]font) +} + func GetFonts() []string { var fonts []string for k := range fontMap { @@ -29,13 +33,23 @@ func MatchFont(name string) string { return "default" } +var fontCache map[string]font + func loadFont(name string) (*font, error) { if name == "" { fmt.Print("font " + name + " not found, using default font") name = "default" } + if f, hit := fontCache[name]; hit { + return &f, nil + } if val, ok := fontMap[strings.ToLower(name)]; ok { - return ParseFlf(name, val) + f, err := ParseFlf(name, val) + if err != nil { + return nil, err + } + fontCache[name] = *f + return f, nil } return nil, fmt.Errorf("font not found") } @@ -680,6 +694,14 @@ var FontKeyboard = "keyboard" var fontKnobZip string var FontKnob = "knob" +//go:embed fontpack/koholint.flf.gz +var fontKoholintZip string +var FontKoholint = "koholint" + +//go:embed fontpack/kompaktblk.flf.gz +var fontKompaktblkZip string +var FontKompaktblk = "kompaktblk" + //go:embed fontpack/konto.flf.gz var fontKontoZip string var FontKonto = "konto" @@ -972,6 +994,10 @@ var FontShimrod = "shimrod" var fontShortZip string var FontShort = "short" +//go:embed fontpack/sixfo.flf.gz +var fontSixfoZip string +var FontSixfo = "sixfo" + //go:embed fontpack/slant.flf.gz var fontSlantZip string var FontSlant = "slant" @@ -1092,6 +1118,10 @@ var FontStarWars = "starwars" var fontStellarZip string var FontStellar = "stellar" +//go:embed fontpack/stencil.flf.gz +var fontStencilZip string +var FontStencil = "stencil" + //go:embed fontpack/stforek.flf.gz var fontStforekZip string var FontStforek = "stforek" @@ -1216,6 +1246,10 @@ var FontTwoPoint = "twopoint" var fontUSAFlagZip string var FontUSAFlag = "usaflag" +//go:embed fontpack/ublk.flf.gz +var fontUblkZip string +var FontUblk = "ublk" + //go:embed fontpack/univers.flf.gz var fontUniversZip string var FontUnivers = "univers" @@ -1407,6 +1441,8 @@ var fontMap = map[string]string{ "kban": fontKbanZip, "keyboard": fontKeyboardZip, "knob": fontKnobZip, + "koholint": fontKoholintZip, + "kompaktblk": fontKompaktblkZip, "konto": fontKontoZip, "kontoslant": fontKontoSlantZip, "lcd": fontLCDZip, @@ -1480,6 +1516,7 @@ var fontMap = map[string]string{ "shadow": fontShadowZip, "shimrod": fontShimrodZip, "short": fontShortZip, + "sixfo": fontSixfoZip, "slant": fontSlantZip, "slantrelief": fontSlantReliefZip, "slide": fontSlideZip, @@ -1510,6 +1547,7 @@ var fontMap = map[string]string{ "starstrips": fontStarStripsZip, "starwars": fontStarWarsZip, "stellar": fontStellarZip, + "stencil": fontStencilZip, "stforek": fontStforekZip, "stickletters": fontStickLettersZip, "stop": fontStopZip, @@ -1541,6 +1579,7 @@ var fontMap = map[string]string{ "twisted": fontTwistedZip, "twopoint": fontTwoPointZip, "usaflag": fontUSAFlagZip, + "ublk": fontUblkZip, "univers": fontUniversZip, "varsity": fontVarsityZip, "wavy": fontWavyZip, diff --git a/ascii/palettes.go b/ascii/palettes.go index 9e7ee6d..93ef3de 100644 --- a/ascii/palettes.go +++ b/ascii/palettes.go @@ -77,24 +77,42 @@ var ( Colours: []string{"4285F4", "DB4437", "F4B400", "4285F4", "0F9D58", "DB4437"}, ColourMode: modeLetter, } - White = Palette{ - Name: "White", + PaletteWhite = Palette{ + Name: "PaletteWhite", Key: "white", Colours: []string{"FFFFFF"}, ColourMode: modeSingle, } + PaletteBlack = Palette{ + Name: "PaletteBlack", + Key: "white", + Colours: []string{"000000"}, + ColourMode: modeSingle, + } PaletteRed = Palette{ Name: "Red", Key: "red", Colours: []string{"ff0000"}, ColourMode: modeSingle, } + PaletteCyan = Palette{ + Name: "Cyan", + Key: "cyan", + Colours: []string{"00FFFF"}, + ColourMode: modeSingle, + } PaletteGreen = Palette{ Name: "Green", Key: "green", Colours: []string{"008000"}, ColourMode: modeSingle, } + PaletteLime = Palette{ + Name: "Lime", + Key: "lime", + Colours: []string{"66ff00"}, + ColourMode: modeSingle, + } PaletteBlue = Palette{ Name: "Blue", Key: "blue", @@ -139,9 +157,9 @@ var ( } ) -var PaletteDefault = White +var PaletteDefault = PaletteWhite -var ProfileMap = map[string]Palette{ +var PaletteMap = map[string]Palette{ "mint": PaletteMintGreen, "matrix": PaletteMatrixGreen, "bog": PaletteBogGreen, @@ -151,8 +169,12 @@ var ProfileMap = map[string]Palette{ "retro": PaletteRetroIcyPole, "google": PaletteGoogle, "default": PaletteDefault, + "white": PaletteWhite, + "black": PaletteBlack, "red": PaletteRed, + "cyan": PaletteCyan, "green": PaletteGreen, + "lime": PaletteLime, "blue": PaletteBlue, "yellow": PaletteYellow, "purple": PalettePurple, @@ -163,7 +185,7 @@ var ProfileMap = map[string]Palette{ } func GetPalette(p string) Palette { - if val, ok := ProfileMap[p]; ok { + if val, ok := PaletteMap[p]; ok { return val } fmt.Println("Palette not found, using default palette") diff --git a/ascii/random.go b/ascii/random.go new file mode 100644 index 0000000..b35019c --- /dev/null +++ b/ascii/random.go @@ -0,0 +1,41 @@ +package ascii + +import ( + "math/rand" +) + +func allPalettes() []Palette { + var a []Palette + for _, v := range PaletteMap { + a = append(a, v) + } + return a +} +func RandomPalette(p ...Palette) Palette { + var pset []Palette + if len(p) > 0 { + pset = p + } else { + pset = allPalettes() + } + + return pset[rand.Intn(len(pset))] +} + +func allFonts() []string { + var a []string + for _, v := range fontMap { + a = append(a, v) + } + return a +} +func RandomFont(p ...string) string { + var fset []string + if len(p) > 0 { + fset = p + } else { + fset = allFonts() + } + + return fset[rand.Intn(len(fset))] +} diff --git a/cmd/animate.go b/cmd/animate.go new file mode 100644 index 0000000..e4ab7c6 --- /dev/null +++ b/cmd/animate.go @@ -0,0 +1,45 @@ +package cmd + +import ( + "context" + "os" + "os/signal" + "syscall" + "time" + + "github.com/socialviolation/asciiban/animate" + "github.com/spf13/cobra" + //_ "net/http/pprof" +) + +var sequence string +var duration int + +var animateCmd = &cobra.Command{ + Use: "animate", + Short: "Animate", + Args: cobra.MinimumNArgs(1), + Run: func(cmd *cobra.Command, args []string) { + a := getOpts(args) + ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM, syscall.SIGQUIT) + defer cancel() + + if duration > 0 { + var timeoutCancel context.CancelFunc + ctx, timeoutCancel = context.WithTimeout(ctx, time.Duration(duration)*time.Second) + defer timeoutCancel() + } + + animate.Animate(ctx, animate.GetSequence(sequence), a...) + if ctx.Err() != nil { + syscall.Kill(syscall.Getpid(), syscall.SIGKILL) // Send SIGKILL to the current process + } + os.Exit(0) + }, +} + +func init() { + rootCmd.AddCommand(animateCmd) + animateCmd.PersistentFlags().StringVarP(&sequence, "sequence", "s", "default", "Animation sequence") + animateCmd.PersistentFlags().IntVarP(&duration, "duration", "d", 0, "Animation duration") +} diff --git a/cmd/fonts.go b/cmd/fonts.go index 1cdd337..7cdf738 100644 --- a/cmd/fonts.go +++ b/cmd/fonts.go @@ -2,9 +2,10 @@ package cmd import ( "fmt" - "github.com/socialviolation/asciiban/ascii" "sort" + "github.com/socialviolation/asciiban/ascii" + "github.com/spf13/cobra" ) @@ -34,11 +35,11 @@ var fontsTestCmd = &cobra.Command{ fonts := ascii.GetFonts() sort.Strings(fonts) - a := getArgs(args) + a := getOpts(args) for _, k := range fonts { fmt.Println(k) - a.Font = k - ascii.Print(a) + a = append(a, ascii.WithFont(k)) + ascii.Draw(a...) fmt.Println() } }, diff --git a/cmd/palettes.go b/cmd/palettes.go index 4a01f5e..8e7d482 100644 --- a/cmd/palettes.go +++ b/cmd/palettes.go @@ -2,6 +2,7 @@ package cmd import ( "fmt" + "github.com/socialviolation/asciiban/ascii" "github.com/spf13/cobra" ) @@ -17,7 +18,7 @@ var palettesListCmd = &cobra.Command{ Use: "list", Short: "List all available colour palettes", Run: func(cmd *cobra.Command, args []string) { - for p, _ := range ascii.ProfileMap { + for p, _ := range ascii.PaletteMap { fmt.Println(p) } }, @@ -28,11 +29,11 @@ var palettesTestCmd = &cobra.Command{ Use: "test", Short: "Test all available colour palettes", Run: func(cmd *cobra.Command, args []string) { - a := getArgs(args) - for p, _ := range ascii.ProfileMap { + a := getOpts(args) + for p, _ := range ascii.PaletteMap { fmt.Println(p) - a.Palette = ascii.GetPalette(p) - ascii.Print(a) + a = append(a, ascii.WithPaletteName(p)) + ascii.Draw(a...) fmt.Println() } }, diff --git a/cmd/root.go b/cmd/root.go index 0c24871..0a45c8a 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -1,9 +1,10 @@ package cmd import ( - "github.com/socialviolation/asciiban/ascii" "os" + "github.com/socialviolation/asciiban/ascii" + "github.com/spf13/cobra" ) @@ -19,19 +20,18 @@ var rootCmd = &cobra.Command{ Short: "Generate ascii banner", Args: cobra.MinimumNArgs(1), Run: func(cmd *cobra.Command, args []string) { - a := getArgs(args) - ascii.Print(a) + a := getOpts(args) + ascii.Draw(a...) }, } -// rootCmd represents the base command when called without any subcommands var randomCmd = &cobra.Command{ Use: "random", Short: "Generate ascii banner using random font & colours", Args: cobra.MinimumNArgs(1), Run: func(cmd *cobra.Command, args []string) { - a := getArgs(args) - ascii.Random(a) + a := getOpts(args) + ascii.Random(a...) }, } @@ -49,24 +49,21 @@ func init() { rootCmd.PersistentFlags().StringVarP(&palette, "palette", "p", "default", "Colour palette to use") rootCmd.PersistentFlags().StringVarP(&font, "font", "f", "ansishadow", "Colour palette to use") rootCmd.PersistentFlags().StringVarP(&mode, "mode", "m", "", "Palette Colour Mode (simple | alternating | vertical | horizontal)") - rootCmd.PersistentFlags().BoolVarP(&trim, "trim", "t", true, "Trim empty lines") - rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "Verbose") + rootCmd.PersistentFlags().BoolVarP(&trim, "trim", "t", true, "trim empty lines") + rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "verbose") } -func getArgs(args []string) ascii.Args { - a := ascii.DefaultArgs +func getOpts(args []string) []ascii.BannerOption { + var a []ascii.BannerOption if len(args) > 0 { - a.Message = args[0] - } - a.Verbose = verbose - var err error - a.Font = ascii.MatchFont(font) - if err != nil { - panic(err) + a = append(a, ascii.WithMessage(args[0])) } - a.Palette = ascii.GetPalette(palette) + a = append(a, ascii.WithTrim(trim)) + a = append(a, ascii.WithVerbose(verbose)) + a = append(a, ascii.WithFont(font)) + a = append(a, ascii.WithPaletteName(palette)) if mode != "" { - a.ColourMode = ascii.GetColourMode(mode) + a = append(a, ascii.WithColourModeName(mode)) } return a diff --git a/gen.go b/gen.go index 49cdd10..fb8b1a7 100644 --- a/gen.go +++ b/gen.go @@ -5,7 +5,6 @@ package main import ( "compress/gzip" "fmt" - "github.com/go-git/go-git/v5" "io" "io/fs" "log" @@ -14,6 +13,8 @@ import ( "strings" "text/template" "time" + + "github.com/go-git/go-git/v5" ) func contains(s []string, e string) bool { @@ -144,6 +145,10 @@ import ( "strings" ) +func init() { + fontCache = make(map[string]font) +} + func GetFonts() []string { var fonts []string for k := range fontMap { @@ -161,13 +166,23 @@ func MatchFont(name string) string { return "default" } +var fontCache map[string]font + func loadFont(name string) (*font, error) { if name == "" { fmt.Print("font " + name + " not found, using default font") name = "default" } + if f, hit := fontCache[name]; hit { + return &f, nil + } if val, ok := fontMap[strings.ToLower(name)]; ok { - return ParseFlf(name, val) + f, err := ParseFlf(name, val) + if err != nil { + return nil, err + } + fontCache[name] = *f + return f, nil } return nil, fmt.Errorf("font not found") } diff --git a/go.mod b/go.mod index 7384ff7..7661bf8 100644 --- a/go.mod +++ b/go.mod @@ -1,36 +1,38 @@ module github.com/socialviolation/asciiban -go 1.20 +go 1.22 require ( - github.com/go-git/go-git/v5 v5.6.1 + github.com/go-git/go-git/v5 v5.12.0 github.com/gookit/color v1.5.4 - + github.com/spf13/cobra v1.8.1 ) require ( - github.com/Microsoft/go-winio v0.6.0 // indirect - github.com/ProtonMail/go-crypto v0.0.0-20230331115716-d34776aa93ec // indirect - github.com/acomagu/bufpipe v1.0.4 // indirect - github.com/cloudflare/circl v1.3.2 // indirect + dario.cat/mergo v1.0.0 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/ProtonMail/go-crypto v1.0.0 // indirect + github.com/cloudflare/circl v1.3.7 // indirect + github.com/cyphar/filepath-securejoin v0.2.4 // indirect github.com/emirpasic/gods v1.18.1 // indirect - github.com/go-git/gcfg v1.5.0 // indirect - github.com/go-git/go-billy/v5 v5.4.1 // indirect - github.com/imdario/mergo v0.3.15 // indirect + github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect + github.com/go-git/go-billy/v5 v5.5.0 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/gosuri/uilive v0.0.4 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/pjbgf/sha1cd v0.3.0 // indirect - github.com/sergi/go-diff v1.3.1 // indirect - github.com/skeema/knownhosts v1.1.0 // indirect - github.com/spf13/cobra v1.7.0 // indirect + github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect + github.com/skeema/knownhosts v1.2.2 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect - golang.org/x/crypto v0.8.0 // indirect - golang.org/x/mod v0.10.0 // indirect - golang.org/x/net v0.9.0 // indirect - golang.org/x/sys v0.10.0 // indirect - golang.org/x/tools v0.8.0 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/mod v0.12.0 // indirect + golang.org/x/net v0.22.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/tools v0.13.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect ) diff --git a/go.sum b/go.sum index 1d46846..23e22bb 100644 --- a/go.sum +++ b/go.sum @@ -1,153 +1,140 @@ +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= -github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= -github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g= -github.com/ProtonMail/go-crypto v0.0.0-20230331115716-d34776aa93ec h1:eQusauqzE1cAFR5hGnwkuSmFxKoy3+j9/cVaDeYfjjs= -github.com/ProtonMail/go-crypto v0.0.0-20230331115716-d34776aa93ec/go.mod h1:8TI4H3IbrackdNgv+92dI+rhpCaLqM0IfpgCgenFvRE= -github.com/acomagu/bufpipe v1.0.4 h1:e3H4WUzM3npvo5uv95QuJM3cQspFNtFBzvJ2oNjKIDQ= -github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= +github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= -github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I= -github.com/cloudflare/circl v1.3.2 h1:VWp8dY3yH69fdM7lM6A1+NhhVoDu9vqK0jOgmkQHFWk= -github.com/cloudflare/circl v1.3.2/go.mod h1:+CauBF6R70Jqcyl8N2hC8pAXYbWkGIezuSbuGLtRhnw= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= +github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= +github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= +github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= +github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= +github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= -github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= -github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= -github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= -github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= -github.com/go-git/go-billy/v5 v5.4.1 h1:Uwp5tDRkPr+l/TnbHOQzp+tmJfLceOlbVucgpTz8ix4= -github.com/go-git/go-billy/v5 v5.4.1/go.mod h1:vjbugF6Fz7JIflbVpl1hJsGjSHNltrSw45YK/ukIvQg= -github.com/go-git/go-git-fixtures/v4 v4.3.1 h1:y5z6dd3qi8Hl+stezc8p3JxDkoTRqMAlKnXHuzrfjTQ= -github.com/go-git/go-git-fixtures/v4 v4.3.1/go.mod h1:8LHG1a3SRW71ettAD/jW13h8c6AqjVSeL11RAdgaqpo= -github.com/go-git/go-git/v5 v5.6.1 h1:q4ZRqQl4pR/ZJHc1L5CFjGA1a10u76aV1iC+nh+bHsk= -github.com/go-git/go-git/v5 v5.6.1/go.mod h1:mvyoL6Unz0PiTQrGQfSfiLFhBH1c1e84ylC2MDs4ee8= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/gookit/color v1.5.3 h1:twfIhZs4QLCtimkP7MOxlF3A0U/5cDPseRT9M/+2SCE= -github.com/gookit/color v1.5.3/go.mod h1:NUzwzeehUfl7GIb36pqId+UGmRfQcU/WiiyTTeNjHtE= +github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE= +github.com/gliderlabs/ssh v0.3.7/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= +github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= +github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= +github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys= +github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0= github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w= -github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/imdario/mergo v0.3.15 h1:M8XP7IuFNsqUx6VPK2P9OSmsYsI/YFaGil0uD21V3dM= -github.com/imdario/mergo v0.3.15/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/gosuri/uilive v0.0.4 h1:hUEBpQDj8D8jXgtCdBu7sWsy5sbW/5GhuO8KBwJ2jyY= +github.com/gosuri/uilive v0.0.4/go.mod h1:V/epo5LjjlDE5RJUcqx8dbw+zc93y5Ya3yg8tfZ74VI= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A= -github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= -github.com/mmcloughlin/avo v0.5.0/go.mod h1:ChHFdoV7ql95Wi7vuq2YT1bwCJqiWdZrQ1im3VujLYM= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= -github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/skeema/knownhosts v1.1.0 h1:Wvr9V0MxhjRbl3f9nMnKnFfiWTJmtECJ9Njkea3ysW0= -github.com/skeema/knownhosts v1.1.0/go.mod h1:sKFq3RD6/TKZkSWn8boUbDC7Qkgcv+8XXijpFO6roag= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A= +github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -golang.org/x/arch v0.1.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220826181053-bd7e27e6170d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ= -golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20220909182711-5c715a9e8561 h1:MDc5xs78ZrZr3HMQugiXOAkSZtfTpbJLDr/lwfgO53E= +golang.org/x/exp v0.0.0-20220909182711-5c715a9e8561/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= -golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -155,27 +142,22 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.8.0 h1:vSDcovVPld282ceKgDimkRSC8kpaH1dgyc9UMzlt84Y= -golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/justfile b/justfile deleted file mode 100644 index 4647864..0000000 --- a/justfile +++ /dev/null @@ -1,22 +0,0 @@ -set dotenv-load -set fallback := false - -BINDIR := justfile_directory() + '/bin' -BINARY := "asciiban" - -@default: - just --list --unsorted - -build: - go build -o {{BINDIR}}/{{BINARY}} main.go - {{BINDIR}}/{{BINARY}} "test message" -p retro - -generate: - go generate ./... - -output_readme_screens: - {{BINARY}} "america" -p patriot -f dosrebel - {{BINARY}} "what is real?" -p matrix -f georgia11 - {{BINARY}} "Google" -p google -f univers - {{BINARY}} "Good yard" -f crazy -p retro -