From 6d6bf4f07639c8ce4114798ed79fa155a13b47df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Motiejus=20Jak=C5=A1tys?= Date: Mon, 24 May 2021 00:11:58 +0300 Subject: [PATCH] wip constructors --- internal/cmd/BUILD | 8 ++++++++ internal/cmd/cmd.go | 20 ++++++++++++++++++++ internal/cmdrootfs/BUILD | 1 + internal/cmdrootfs/cmdrootfs.go | 18 +++++++++++++++--- 4 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 internal/cmd/BUILD create mode 100644 internal/cmd/cmd.go diff --git a/internal/cmd/BUILD b/internal/cmd/BUILD new file mode 100644 index 0000000..9105e59 --- /dev/null +++ b/internal/cmd/BUILD @@ -0,0 +1,8 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["cmd.go"], + importpath = "github.com/motiejus/code/undocker/internal/cmd", + visibility = ["//src/undocker:__subpackages__"], +) diff --git a/internal/cmd/cmd.go b/internal/cmd/cmd.go new file mode 100644 index 0000000..7d25064 --- /dev/null +++ b/internal/cmd/cmd.go @@ -0,0 +1,20 @@ +package cmd + +import ( + "io" + "os" +) + +// BaseCommand provides common fields to all commands. +type BaseCommand struct { + Stdin io.ReadCloser + Stdout io.WriteCloser + Stderr io.WriteCloser +} + +// Init initializes BaseCommand with default arguments +func (b *BaseCommand) Init() { + b.Stdin = os.Stdin + b.Stdout = os.Stdout + b.Stderr = os.Stderr +} diff --git a/internal/cmdrootfs/BUILD b/internal/cmdrootfs/BUILD index 6bf183a..d3637c5 100644 --- a/internal/cmdrootfs/BUILD +++ b/internal/cmdrootfs/BUILD @@ -6,6 +6,7 @@ go_library( importpath = "github.com/motiejus/code/undocker/internal/cmdrootfs", visibility = ["//src/undocker:__subpackages__"], deps = [ + "//src/undocker/internal/cmd:go_default_library", "//src/undocker/rootfs:go_default_library", "@com_github_jessevdk_go_flags//:go_default_library", "@com_github_ulikunitz_xz//:go_default_library", diff --git a/internal/cmdrootfs/cmdrootfs.go b/internal/cmdrootfs/cmdrootfs.go index 4b39424..04c27d4 100644 --- a/internal/cmdrootfs/cmdrootfs.go +++ b/internal/cmdrootfs/cmdrootfs.go @@ -6,6 +6,7 @@ import ( "os" goflags "github.com/jessevdk/go-flags" + "github.com/motiejus/code/undocker/internal/cmd" "github.com/motiejus/code/undocker/rootfs" "github.com/ulikunitz/xz" "go.uber.org/multierr" @@ -13,6 +14,8 @@ import ( // Command is "rootfs" command type Command struct { + cmd.BaseCommand + PositionalArgs struct { Infile goflags.Filename `long:"infile" description:"Input tarball"` Outfile string `long:"outfile" description:"Output path, stdout is '-'"` @@ -29,9 +32,7 @@ func (c *Command) Execute(args []string) (err error) { return errors.New("too many args") } if c.rootfsNew == nil { - c.rootfsNew = func(r io.ReadSeeker) io.WriterTo { - return rootfs.New(r) - } + c.init() } rd, err := os.Open(string(c.PositionalArgs.Infile)) @@ -67,3 +68,14 @@ func (c *Command) Execute(args []string) (err error) { } return nil } + +// init() initializes Command with the default options. +// +// Since constructors for sub-commands requires lots of boilerplate, +// command will initialize itself. +func (c *Command) init() { + c.BaseCommand.Init() + c.rootfsNew = func(r io.ReadSeeker) io.WriterTo { + return rootfs.New(r) + } +}