Skip to content

Commit e0c025c

Browse files
committed
Refactor pager functionality into a package
Make it possible to output to the pager for other commands without having to duplicate deciding whether we're calling an external pager or writing directly STDOUT based on our configuration.
1 parent 76d4f20 commit e0c025c

File tree

2 files changed

+58
-35
lines changed

2 files changed

+58
-35
lines changed

cmd/outline.go

+7-35
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,8 @@
11
package cmd
22

33
import (
4-
"fmt"
5-
"io"
64
"log"
7-
"os"
8-
"os/exec"
95
"strings"
10-
"sync"
116

127
"github.com/msp301/zb/graph"
138
"github.com/msp301/zb/pager"
@@ -19,52 +14,29 @@ var outlineCmd = &cobra.Command{
1914
Use: "outline",
2015
Short: "Output notes as a tree",
2116
Run: func(cmd *cobra.Command, args []string) {
22-
pager := pager.FindPager()
23-
24-
var pipe io.WriteCloser
25-
26-
var command *exec.Cmd
27-
if pager == "" {
28-
pipe = os.Stdout
29-
} else {
30-
command = exec.Command(pager)
31-
command.Stdout = os.Stdout
32-
command.Stderr = os.Stderr
33-
34-
var err error
35-
pipe, err = command.StdinPipe()
36-
if err != nil {
37-
log.Fatal(err)
38-
}
17+
pager, err := pager.Open()
18+
if err != nil {
19+
log.Fatal(err)
3920
}
4021

41-
var wg sync.WaitGroup
42-
wg.Add(1)
43-
4422
go func() {
45-
defer pipe.Close()
23+
defer pager.Close()
4624

4725
book().Notes.Walk(func(vertex graph.Vertex, depth int) bool {
4826
indent := strings.Repeat("\t", depth)
4927
switch val := vertex.Properties["Value"].(type) {
5028
case parser.Note:
51-
_, err := fmt.Fprintf(pipe, "%s%s - %s\n", indent, val.File, val.Title)
29+
_, err := pager.Writef("%s%s - %s\n", indent, val.File, val.Title)
5230
if err != nil {
5331
log.Fatal(err)
5432
}
5533
}
5634
return true
5735
}, -1)
58-
59-
wg.Done()
6036
}()
6137

62-
if pager == "" {
63-
wg.Wait()
64-
} else {
65-
if err := command.Run(); err != nil {
66-
log.Fatal(err)
67-
}
38+
if err := pager.Wait(); err != nil {
39+
log.Fatal(err)
6840
}
6941
},
7042
}

pager/pager.go

+51
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package pager
22

33
import (
4+
"fmt"
5+
"io"
46
"os"
7+
"os/exec"
8+
"sync"
59

610
"github.com/spf13/viper"
711
)
@@ -19,3 +23,50 @@ func FindPager() string {
1923

2024
return ""
2125
}
26+
27+
type Pager struct {
28+
pipe io.WriteCloser
29+
command *exec.Cmd
30+
wg sync.WaitGroup
31+
}
32+
33+
func Open() (*Pager, error) {
34+
pagerCmd := FindPager()
35+
36+
var pager = Pager{}
37+
pager.wg.Add(1)
38+
39+
if pagerCmd == "" {
40+
pager.pipe = os.Stdout
41+
} else {
42+
pager.command = exec.Command(pagerCmd)
43+
pager.command.Stdout = os.Stdout
44+
pager.command.Stderr = os.Stderr
45+
46+
var err error
47+
pager.pipe, err = pager.command.StdinPipe()
48+
if err != nil {
49+
return nil, err
50+
}
51+
}
52+
53+
return &pager, nil
54+
}
55+
56+
func (pager *Pager) Close() {
57+
pager.pipe.Close()
58+
pager.wg.Done()
59+
}
60+
61+
func (pager *Pager) Wait() error {
62+
if pager.command == nil {
63+
pager.wg.Wait()
64+
return nil
65+
}
66+
67+
return pager.command.Run()
68+
}
69+
70+
func (pager *Pager) Writef(format string, args ...interface{}) (int, error) {
71+
return fmt.Fprintf(pager.pipe, format, args...)
72+
}

0 commit comments

Comments
 (0)