Skip to content

Commit

Permalink
grow and spread (#238)
Browse files Browse the repository at this point in the history
  • Loading branch information
ddddddO committed Sep 24, 2023
1 parent 9c5e3a8 commit 69b6144
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 7 deletions.
36 changes: 29 additions & 7 deletions simple_tree.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@ import (
)

type treeSimple struct {
grower growerSimple
spreader spreaderSimple
mkdirer mkdirerSimple
verifier verifierSimple
grower growerSimple
spreader spreaderSimple
mkdirer mkdirerSimple
verifier verifierSimple
growSpreader growSpreaderSimple
}

var _ tree = (*treeSimple)(nil)
Expand Down Expand Up @@ -40,6 +41,10 @@ func newTreeSimple(cfg *config) tree {
return newVerifierSimple(targetDir, strict)
}

growSpreaderFactory := func(lastNodeFormat, intermedialNodeFormat branchFormat, dryrun bool) growSpreaderSimple {
return newGrowSpreaderSimple(lastNodeFormat, intermedialNodeFormat, dryrun)
}

return &treeSimple{
grower: growerFactory(
cfg.lastNodeFormat,
Expand All @@ -60,6 +65,11 @@ func newTreeSimple(cfg *config) tree {
cfg.targetDir,
cfg.strictVerify,
),
growSpreader: growSpreaderFactory(
cfg.lastNodeFormat,
cfg.intermedialNodeFormat,
cfg.dryrun,
),
}
}

Expand All @@ -76,10 +86,15 @@ func (t *treeSimple) output(w io.Writer, r io.Reader, cfg *config) error {
}

func (t *treeSimple) outputProgrammably(w io.Writer, root *Node, cfg *config) error {
if err := t.grower.grow([]*Node{root}); err != nil {
return err
if cfg.encode != encodeDefault {
if err := t.grower.grow([]*Node{root}); err != nil {
return err
}
return t.spreader.spread(w, []*Node{root})
}
return t.spreader.spread(w, []*Node{root})

// JSONなどのフォーマットに変えずに出力する場合は、枝の形成と出力を分けない
return t.growSpreader.growAndSpread(w, []*Node{root})
}

func (t *treeSimple) mkdir(r io.Reader, cfg *config) error {
Expand Down Expand Up @@ -152,3 +167,10 @@ type mkdirerSimple interface {
type verifierSimple interface {
verify([]*Node) error
}

// TODO: このコミット辺りのリファクタリング
// 関心事は枝の形成と出力
// 枝の組み立てと出力を同じloop内でしないと、例えばこれまで通り 1.grower -> 2.spreader の処理順だと、1が遅すぎる場合利用者からするといつ出力されるのか?となるし、処理回数的には無駄なため
type growSpreaderSimple interface {
growAndSpread(io.Writer, []*Node) error
}
59 changes: 59 additions & 0 deletions simple_tree_grow_spreader.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
//go:build !tinywasm

package gtree

import (
"fmt"
"io"
)

func newGrowSpreaderSimple(
lastNodeFormat, intermedialNodeFormat branchFormat,
enabledValidation bool,
) growSpreaderSimple {
return &defaultGrowSpreaderSimple{
defaultGrowerSimple: &defaultGrowerSimple{
lastNodeFormat: lastNodeFormat,
intermedialNodeFormat: intermedialNodeFormat,
enabledValidation: enabledValidation,
},
}
}

type defaultGrowSpreaderSimple struct {
*defaultGrowerSimple
w io.Writer
}

func (dg *defaultGrowSpreaderSimple) growAndSpread(w io.Writer, roots []*Node) error {
dg.w = w
for _, root := range roots {
if err := dg.assembleAndPrint(root); err != nil {
return err
}
}
return nil
}

func (dg *defaultGrowSpreaderSimple) assembleAndPrint(current *Node) error {
if err := dg.assembleBranch(current); err != nil {
return err
}

ret := current.name + "\n"
if !current.isRoot() {
ret = current.branch() + " " + current.name + "\n"
}
fmt.Fprint(dg.w, ret)

for _, child := range current.children {
if err := dg.assembleAndPrint(child); err != nil {
return err
}
}
return nil
}

var (
_ growSpreaderSimple = (*defaultGrowSpreaderSimple)(nil)
)

0 comments on commit 69b6144

Please sign in to comment.