Skip to content

Commit

Permalink
🎨 show off multi-task functionality in the readme
Browse files Browse the repository at this point in the history
  • Loading branch information
acidjazz committed May 6, 2024
1 parent 7116c09 commit 7c0c981
Show file tree
Hide file tree
Showing 8 changed files with 279 additions and 29 deletions.
54 changes: 41 additions & 13 deletions config.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,25 +7,53 @@ import (
)

type Config struct {
Spinner spinner.Spinner
Colors ConfigColors
ProgressOption progress.Option
Options ConfigOptions
Spinner spinner.Spinner
Colors ConfigColors
ProgressOptions []progress.Option
Chars ConfigChars
}

type ConfigOptions struct {
ExitOnFailure bool
}

type ConfigColors struct {
Spinner lipgloss.Color
Pending lipgloss.Color
Success lipgloss.Color
Failure lipgloss.Color
Spinner lipgloss.Color
Pending lipgloss.Color
Success lipgloss.Color
Failure lipgloss.Color
ParentStarted lipgloss.Color
}

type ConfigChars struct {
ParentStarted string
NotStarted string
Success string
Failure string
}

var Defaults = Config{
Spinner: spinner.Dot,
ProgressOption: progress.WithDefaultGradient(),
Options: ConfigOptions{
ExitOnFailure: true,
},
Spinner: spinner.Dot,
ProgressOptions: []progress.Option{
progress.WithDefaultGradient(),
progress.WithoutPercentage(),
progress.WithWidth(10),
},
Colors: ConfigColors{
Spinner: lipgloss.Color("214"),
Pending: lipgloss.Color("21"),
Success: lipgloss.Color("46"),
Failure: lipgloss.Color("196"),
Spinner: lipgloss.Color("214"),
Pending: lipgloss.Color("lightgrey"),
Success: lipgloss.Color("46"),
Failure: lipgloss.Color("196"),
ParentStarted: lipgloss.Color("214"),
},
Chars: ConfigChars{
ParentStarted: "»",
NotStarted: "•",
Success: "✔",
Failure: "✘",
},
}
64 changes: 64 additions & 0 deletions examples/multi/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package main

import (
"fmt"
"github.com/fumeapp/taskin"
"time"
)

func main() {

tasks := taskin.New(taskin.Tasks{
{
Title: "Mow the lawn",
Task: func(t *taskin.Task) error {
for i := 0; i < 3; i++ {
t.Title = fmt.Sprintf("Mow the lawn: [%d/3] passes", i+1)
time.Sleep(500 * time.Millisecond)
}
return nil
},
},
{
Title: "Pluck the Chickens",
Tasks: taskin.Tasks{
{
Title: "Pluck the silkies",
Task: func(t *taskin.Task) error {
for i := 0; i < 3; i++ {
t.Title = fmt.Sprintf(" [%d/3] silkies plucked", i+1)
time.Sleep(500 * time.Millisecond)
}
return nil
},
},
{
Title: "Pluck the leghorns",
Task: func(t *taskin.Task) error {
for i := 0; i < 3; i++ {
t.Title = fmt.Sprintf(" [%d/3] leghorns plucked", i+1)
time.Sleep(500 * time.Millisecond)
}
return nil
},
},
},
},
{
Title: "Paint the house",
Task: func(t *taskin.Task) error {
for i := 0; i < 3; i++ {
t.Progress(i+1, 5)
t.Title = fmt.Sprintf("Paint the house: [%d/3] walls painted", i+1)
time.Sleep(500 * time.Millisecond)
}
return nil
},
},
}, taskin.Defaults)
err := tasks.Run()

if err != nil {
panic(err)
}
}
2 changes: 0 additions & 2 deletions examples/simple/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ func main() {
tasks := taskin.New(taskin.Tasks{
{
Title: "Task 1",
// sleep for 3 seconds then return nil
Task: func(t *taskin.Task) error {
for i := 0; i < 3; i++ {
t.Title = fmt.Sprintf("Task 1: [%d/3] seconds have passed", i+1)
Expand All @@ -22,7 +21,6 @@ func main() {
},
{
Title: "Task 2",
// sleep for 3 seconds then return nil
Task: func(t *taskin.Task) error {
for i := 0; i < 3; i++ {
t.Title = fmt.Sprintf("Task 2: [%d/3] seconds have passed", i+1)
Expand Down
10 changes: 6 additions & 4 deletions models.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ type Task struct {
ShowProgress TaskProgress
Bar progress.Model
Config Config
Tasks Tasks
}

type TaskProgress struct {
Expand All @@ -30,10 +31,11 @@ type TaskProgress struct {
type Tasks []Task

type Runner struct {
Task Task
State TaskState
Spinner spinner.Model
Config Config
Task Task
State TaskState
Spinner spinner.Model
Config Config
Children Runners
}

type Runners []Runner
Binary file added multi.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
53 changes: 46 additions & 7 deletions mvc.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ func (r *Runners) Init() tea.Cmd {
var cmds []tea.Cmd
for i := range *r {
cmds = append(cmds, (*r)[i].Spinner.Tick)
for j := range (*r)[i].Children {
cmds = append(cmds, (*r)[i].Children[j].Spinner.Tick)
}
}
return tea.Batch(cmds...)
}
Expand All @@ -29,6 +32,18 @@ func (r *Runners) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
cmds = append(cmds, cmd)
}

for j := range (*r)[i].Children {
if (*r)[i].Children[j].State == Running || (*r)[i].Children[j].State == NotStarted {
newSpinner, cmd := (*r)[i].Children[j].Spinner.Update(msg)
(*r)[i].Children[j].Spinner = newSpinner
cmds = append(cmds, cmd)
}
}

if (*r)[i].State == Failed {
return r, tea.Quit
}

if (*r)[i].State != Completed && (*r)[i].State != Failed {
allDone = false
}
Expand All @@ -50,20 +65,44 @@ func (r *Runners) View() string {
status := ""
switch runner.State {
case NotStarted:
status = lipgloss.NewStyle().Foreground(runner.Config.Colors.Pending).Render("•") + " " + runner.Task.Title // Gray bullet
status = lipgloss.NewStyle().Foreground(runner.Config.Colors.Pending).Render(runner.Config.Chars.NotStarted) + " " + runner.Task.Title // Gray bullet
case Running:
if runner.Task.ShowProgress.Total != 0 {
percent := float64(runner.Task.ShowProgress.Current) / float64(runner.Task.ShowProgress.Total)
status = runner.Spinner.View() + runner.Task.Title + " " + runner.Task.Bar.ViewAs(percent)
if len(runner.Children) > 0 {
status = lipgloss.NewStyle().Foreground(runner.Config.Colors.ParentStarted).Render(runner.Config.Chars.ParentStarted) + " " + runner.Task.Title
} else {
status = runner.Spinner.View() + runner.Task.Title
if runner.Task.ShowProgress.Total != 0 {
percent := float64(runner.Task.ShowProgress.Current) / float64(runner.Task.ShowProgress.Total)
status = runner.Spinner.View() + runner.Task.Title + " " + runner.Task.Bar.ViewAs(percent)
} else {
status = runner.Spinner.View() + runner.Task.Title
}
}
case Completed:
status = lipgloss.NewStyle().Foreground(runner.Config.Colors.Success).Render("✔") + " " + runner.Task.Title // Green checkmark
status = lipgloss.NewStyle().Foreground(runner.Config.Colors.Success).Render(runner.Config.Chars.Success) + " " + runner.Task.Title // Green checkmark
case Failed:
status = lipgloss.NewStyle().Foreground(runner.Config.Colors.Failure).Render("✘") + " " + runner.Task.Title // Red 'x'
status = lipgloss.NewStyle().Foreground(runner.Config.Colors.Failure).Render(runner.Config.Chars.Failure) + " " + runner.Task.Title // Red 'x'
}
view += lipgloss.NewStyle().Render(status) + "\n"

for _, child := range runner.Children {
status = ""
switch child.State {
case NotStarted:
status = lipgloss.NewStyle().Foreground(child.Config.Colors.Pending).Render(runner.Config.Chars.NotStarted) + " " + child.Task.Title // Gray bullet
case Running:
if child.Task.ShowProgress.Total != 0 {
percent := float64(child.Task.ShowProgress.Current) / float64(child.Task.ShowProgress.Total)
status = child.Spinner.View() + child.Task.Title + " " + child.Task.Bar.ViewAs(percent)
} else {
status = child.Spinner.View() + child.Task.Title
}
case Completed:
status = lipgloss.NewStyle().Foreground(child.Config.Colors.Success).Render("✔") + " " + child.Task.Title // Green checkmark
case Failed:
status = lipgloss.NewStyle().Foreground(child.Config.Colors.Failure).Render("✘") + " " + child.Task.Title // Red 'x'
}
view += " " + lipgloss.NewStyle().Render(status) + "\n"
}
}
return view
}
76 changes: 76 additions & 0 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
<p align="center"><strong>📋 Add user-friendly tasks to your CLI </strong></p>
<br />

![Multi](/multi.gif)


[![Release](https://img.shields.io/github/v/release/fumeapp/taskin)](https://github.com/fumeapp/taskin/releases)
[![Go Report Card](https://goreportcard.com/badge/github.com/fumeapp/taskin)](https://goreportcard.com/report/github.com/fumeapp/taskin)
Expand Down Expand Up @@ -170,3 +172,77 @@ func main() {


```


## Multi Dimensional
Add multiple tasks to a single task

![Multi](/multi.gif)

```go
package main

import (
"fmt"
"github.com/fumeapp/taskin"
"time"
)

func main() {

tasks := taskin.New(taskin.Tasks{
{
Title: "Mow the lawn",
Task: func(t *taskin.Task) error {
for i := 0; i < 3; i++ {
t.Title = fmt.Sprintf("Mow the lawn: [%d/3] passes", i+1)
time.Sleep(500 * time.Millisecond)
}
return nil
},
},
{
Title: "Pluck the Chickens",
Tasks: taskin.Tasks{
{
Title: "Pluck the silkies",
Task: func(t *taskin.Task) error {
for i := 0; i < 3; i++ {
t.Title = fmt.Sprintf(" [%d/3] silkies plucked", i+1)
time.Sleep(500 * time.Millisecond)
}
return nil
},
},
{
Title: "Pluck the leghorns",
Task: func(t *taskin.Task) error {
for i := 0; i < 3; i++ {
t.Title = fmt.Sprintf(" [%d/3] leghorns plucked", i+1)
time.Sleep(500 * time.Millisecond)
}
return nil
},
},
},
},
{
Title: "Paint the house",
Task: func(t *taskin.Task) error {
for i := 0; i < 3; i++ {
t.Progress(i+1, 5)
t.Title = fmt.Sprintf("Paint the house: [%d/3] walls painted", i+1)
time.Sleep(500 * time.Millisecond)
}
return nil
},
},
}, taskin.Defaults)
err := tasks.Run()

if err != nil {
panic(err)
}
}

```
Loading

0 comments on commit 7c0c981

Please sign in to comment.