From 69b6144c412924e6154550fb1ce484e823fd004f Mon Sep 17 00:00:00 2001 From: Ochi Daiki Date: Sun, 24 Sep 2023 23:22:26 +0900 Subject: [PATCH] grow and spread (#238) --- simple_tree.go | 36 +++++++++++++++++----- simple_tree_grow_spreader.go | 59 ++++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 7 deletions(-) create mode 100644 simple_tree_grow_spreader.go diff --git a/simple_tree.go b/simple_tree.go index 20aa7e8..efb5caa 100644 --- a/simple_tree.go +++ b/simple_tree.go @@ -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) @@ -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, @@ -60,6 +65,11 @@ func newTreeSimple(cfg *config) tree { cfg.targetDir, cfg.strictVerify, ), + growSpreader: growSpreaderFactory( + cfg.lastNodeFormat, + cfg.intermedialNodeFormat, + cfg.dryrun, + ), } } @@ -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 { @@ -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 +} diff --git a/simple_tree_grow_spreader.go b/simple_tree_grow_spreader.go new file mode 100644 index 0000000..51a48ba --- /dev/null +++ b/simple_tree_grow_spreader.go @@ -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) +)