github.com/zyedidia/knit@v1.1.2-0.20230901152954-f7d4e39a0e24/printer.go (about)

     1  package knit
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"path/filepath"
     7  	"sync"
     8  
     9  	pb "github.com/schollz/progressbar/v3"
    10  )
    11  
    12  type BasicPrinter struct {
    13  	w    io.Writer
    14  	lock sync.Mutex
    15  }
    16  
    17  func (p *BasicPrinter) SetSteps(int)      {}
    18  func (p *BasicPrinter) Update()           {}
    19  func (p *BasicPrinter) Clear()            {}
    20  func (p *BasicPrinter) Done(string)       {}
    21  func (p *BasicPrinter) NeedsUpdate() bool { return false }
    22  
    23  func (p *BasicPrinter) Print(cmd, dir string, name string, step int) {
    24  	p.lock.Lock()
    25  	defer p.lock.Unlock()
    26  	if dir != "." {
    27  		fmt.Fprintf(p.w, "[%s] ", dir)
    28  	}
    29  	fmt.Fprintln(p.w, cmd)
    30  }
    31  
    32  type StepPrinter struct {
    33  	w     io.Writer
    34  	lock  sync.Mutex
    35  	steps int
    36  	last  int
    37  }
    38  
    39  func (p *StepPrinter) SetSteps(steps int) {
    40  	p.steps = steps
    41  }
    42  func (p *StepPrinter) Update()           {}
    43  func (p *StepPrinter) Clear()            {}
    44  func (p *StepPrinter) Done(string)       {}
    45  func (p *StepPrinter) NeedsUpdate() bool { return false }
    46  
    47  func (p *StepPrinter) Print(cmd, dir string, name string, step int) {
    48  	p.lock.Lock()
    49  	defer p.lock.Unlock()
    50  	if step <= p.last {
    51  		return
    52  	}
    53  	fmt.Fprintf(p.w, "[%d/%d] ", step, p.steps)
    54  	if dir != "." {
    55  		fmt.Fprintf(p.w, "[%s] ", dir)
    56  	}
    57  	fmt.Fprintln(p.w, name)
    58  	p.last = step
    59  }
    60  
    61  type ProgressPrinter struct {
    62  	w            io.Writer
    63  	lock         sync.Mutex
    64  	bar          *pb.ProgressBar
    65  	tasks        map[string]string
    66  	showCommands bool
    67  }
    68  
    69  func (p *ProgressPrinter) SetSteps(steps int) {
    70  	p.bar = pb.NewOptions64(int64(steps),
    71  		pb.OptionSetWriter(p.w),
    72  		pb.OptionSetWidth(10),
    73  		pb.OptionShowCount(),
    74  		pb.OptionSpinnerType(14),
    75  		pb.OptionFullWidth(),
    76  		pb.OptionSetPredictTime(false),
    77  		pb.OptionSetDescription("Building"),
    78  		pb.OptionOnCompletion(func() {
    79  			fmt.Fprint(p.w, "\n")
    80  		}),
    81  		pb.OptionSetTheme(pb.Theme{
    82  			Saucer:        "=",
    83  			SaucerHead:    ">",
    84  			SaucerPadding: " ",
    85  			BarStart:      "[",
    86  			BarEnd:        "]",
    87  		}))
    88  }
    89  
    90  func (p *ProgressPrinter) NeedsUpdate() bool { return true }
    91  
    92  func (p *ProgressPrinter) Update() {
    93  	p.lock.Lock()
    94  	defer p.lock.Unlock()
    95  	p.bar.RenderBlank()
    96  	fmt.Fprint(p.w, "\r")
    97  }
    98  
    99  func (p *ProgressPrinter) Clear() {
   100  	p.lock.Lock()
   101  	defer p.lock.Unlock()
   102  	p.bar.Clear()
   103  	fmt.Fprint(p.w, "\r")
   104  }
   105  
   106  func (p *ProgressPrinter) Print(cmd, dir string, name string, step int) {
   107  	p.lock.Lock()
   108  	defer p.lock.Unlock()
   109  	p.tasks[name] = cmd
   110  
   111  	if p.showCommands {
   112  		p.bar.Clear()
   113  		fmt.Fprint(p.w, "\r")
   114  		if dir != "." {
   115  			fmt.Fprintf(p.w, "[%s] ", dir)
   116  		}
   117  		fmt.Fprintln(p.w, cmd)
   118  	}
   119  
   120  	p.bar.Describe(p.desc())
   121  	p.bar.RenderBlank()
   122  }
   123  
   124  func (p *ProgressPrinter) desc() string {
   125  	desc := "Building"
   126  	for k := range p.tasks {
   127  		desc += " " + fmt.Sprintf("%-40s", filepath.Base(k))
   128  		break
   129  	}
   130  	return desc
   131  }
   132  
   133  func (p *ProgressPrinter) Done(name string) {
   134  	p.lock.Lock()
   135  	defer p.lock.Unlock()
   136  	delete(p.tasks, name)
   137  	if len(p.tasks) == 0 {
   138  		p.bar.Describe("Built " + name)
   139  	} else {
   140  		p.bar.Describe(p.desc())
   141  	}
   142  	p.bar.Add(1)
   143  }