blob: ae4ebb4f1388e7834e52b7a971059afaffd906bb [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package prettyoutput
import (
"time"
"github.com/jedib0t/go-pretty/v6/progress"
)
func NewPW(totalNum int) progress.Writer {
pw := progress.NewWriter()
pw.SetTrackerLength(25)
pw.SetAutoStop(true)
pw.SetNumTrackersExpected(totalNum)
pw.SetSortBy(progress.SortByPercentDsc)
pw.SetTrackerPosition(progress.PositionRight)
style := progress.StyleDefault
style.Options.PercentIndeterminate = "running"
pw.SetStyle(style)
return pw
}
type ProgressPrintOption struct {
NumTrackersExpected int
}
type ProgressPrinter struct {
progress.Writer
}
func NewProgressPrinter(opt ProgressPrintOption) *ProgressPrinter {
p := &ProgressPrinter{
Writer: progress.NewWriter(),
}
// passed printer options
p.SetNumTrackersExpected(opt.NumTrackersExpected)
// default printer options
p.SetTrackerLength(25)
p.SetAutoStop(true)
p.SetSortBy(progress.SortByPercentDsc)
p.SetTrackerPosition(progress.PositionRight)
style := progress.StyleDefault
style.Options.PercentIndeterminate = "running"
p.SetStyle(style)
return p
}
func (p *ProgressPrinter) BlockedRendered() {
time.Sleep(time.Millisecond * 100)
for p.IsRenderInProgress() {
time.Sleep(time.Millisecond * 100)
}
}
func (p *ProgressPrinter) UpdateProgress(tracker *progress.Tracker, updateF func() (bool, error)) {
var (
done = make(chan struct{})
ticker = time.NewTicker(time.Second * 2)
)
for !tracker.IsDone() {
select {
case <-done:
return
case <-ticker.C:
finished, err := updateF()
if err != nil {
tracker.MarkAsErrored()
done <- struct{}{}
}
if finished {
tracker.MarkAsDone()
done <- struct{}{}
}
}
}
}