Skip to content

Commit

Permalink
feat: initial version
Browse files Browse the repository at this point in the history
  • Loading branch information
adrienaury committed Mar 25, 2024
1 parent 0c22ec4 commit b7ed6eb
Show file tree
Hide file tree
Showing 4 changed files with 223 additions and 20 deletions.
108 changes: 108 additions & 0 deletions cmd/dam/dam.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
// Copyright (C) 2023 CGI France
//
// This file is part of dam.
//
// dam is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// dam is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with dam. If not, see <http://www.gnu.org/licenses/>.

package main

import (
"bufio"
"fmt"
"io"
)

const linebreak byte = 10

type Dam struct {
input *bufio.Scanner
buffer chan []byte
output *bufio.Writer
}

func NewDam(input io.Reader, output io.Writer, capacity int) *Dam {
return &Dam{
input: bufio.NewScanner(input),
buffer: make(chan []byte, capacity),
output: bufio.NewWriter(output),
}
}

func (d *Dam) GetSize() int {
return len(d.buffer)
}

func (d *Dam) IsEmpty() bool {
return d.GetSize() == 0
}

func (d *Dam) Drop() error {
if _, err := d.output.Write(append(<-d.buffer, linebreak)); err != nil {
return fmt.Errorf("%w", err)
}

return nil
}

func (d *Dam) Drain() error {
for !d.IsEmpty() {
if err := d.Drop(); err != nil {
return fmt.Errorf("%w", err)
}
}

d.output.Flush()

return nil
}

func (d *Dam) Spill() error {
for d.GetSize() >= cap(d.buffer) {
if err := d.Drop(); err != nil {
return fmt.Errorf("%w", err)
}
}

d.output.Flush()

return nil
}

func (d *Dam) Add(data []byte) error {
if err := d.Spill(); err != nil {
return fmt.Errorf("%w", err)
}

d.buffer <- data

return nil
}

func (d *Dam) Run() error {
for d.input.Scan() {
if err := d.Add(d.input.Bytes()); err != nil {
return fmt.Errorf("%w", err)
}
}

if err := d.input.Err(); err != nil {
return fmt.Errorf("%w", err)
}

if err := d.Drain(); err != nil {
return fmt.Errorf("%w", err)
}

return nil
}
86 changes: 82 additions & 4 deletions cmd/dam/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,14 @@ package main
import (
"fmt"
"os"
"runtime"
"strconv"
"strings"

"github.com/mattn/go-isatty"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"github.com/spf13/cobra"
)

// Provisioned by ldflags.
Expand All @@ -37,13 +42,86 @@ var (
commit string //nolint: gochecknoglobals
buildDate string //nolint: gochecknoglobals
builtBy string //nolint: gochecknoglobals

verbosity string //nolint: gochecknoglobals
jsonlog bool //nolint: gochecknoglobals
debug bool //nolint: gochecknoglobals
colormode string //nolint: gochecknoglobals
)

func main() {
//nolint: exhaustruct
log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr})
cobra.OnInitialize(initLog)

rootCmd := &cobra.Command{ //nolint:exhaustruct
Use: name,
Version: fmt.Sprintf(`%v (commit=%v date=%v by=%v)
Copyright (C) 2024 CGI France
License GPLv3: GNU GPL version 3 <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.`, version, commit, buildDate, builtBy),
Args: cobra.ExactArgs(1),
RunE: func(_ *cobra.Command, args []string) error {
capacity, err := strconv.ParseInt(args[0], 10, 32)
if err != nil {
return fmt.Errorf("%w", err)
}

dam := NewDam(os.Stdin, os.Stdout, int(capacity))

return dam.Run()
},
}

rootCmd.PersistentFlags().StringVarP(&verbosity, "verbosity", "v", "warn",
"set level of log verbosity : none (0), error (1), warn (2), info (3), debug (4), trace (5)")
rootCmd.PersistentFlags().BoolVar(&debug, "debug", false, "add debug information to logs (very slow)")
rootCmd.PersistentFlags().BoolVar(&jsonlog, "log-json", false, "output logs in JSON format")
rootCmd.PersistentFlags().StringVar(&colormode, "color", "auto", "use colors in log outputs : yes, no or auto")

if err := rootCmd.Execute(); err != nil {
log.Err(err).Msg("error when executing command")
os.Exit(1)
}
}

func initLog() {
color := false

switch strings.ToLower(colormode) {
case "auto":
if isatty.IsTerminal(os.Stdout.Fd()) && runtime.GOOS != "windows" {
color = true
}
case "yes", "true", "1", "on", "enable":
color = true
}

log.Info().Msgf("%v %v (commit=%v date=%v by=%v)", name, version, commit, buildDate, builtBy)
if jsonlog {
log.Logger = zerolog.New(os.Stderr)
} else {
log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr, NoColor: !color}) //nolint:exhaustruct
}

if debug {
log.Logger = log.Logger.With().Caller().Logger()
}

setVerbosity()
}

fmt.Println()
func setVerbosity() {
switch verbosity {
case "trace", "5":
zerolog.SetGlobalLevel(zerolog.TraceLevel)
case "debug", "4":
zerolog.SetGlobalLevel(zerolog.DebugLevel)
case "info", "3":
zerolog.SetGlobalLevel(zerolog.InfoLevel)
case "warn", "2":
zerolog.SetGlobalLevel(zerolog.WarnLevel)
case "error", "1":
zerolog.SetGlobalLevel(zerolog.ErrorLevel)
default:
zerolog.SetGlobalLevel(zerolog.Disabled)
}
}
13 changes: 9 additions & 4 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,15 @@ module github.com/cgi-fr/dam

go 1.21

require github.com/rs/zerolog v1.28.0
require (
github.com/mattn/go-isatty v0.0.20
github.com/rs/zerolog v1.32.0
github.com/spf13/cobra v1.8.0
)

require (
github.com/mattn/go-colorable v0.1.12 // indirect
github.com/mattn/go-isatty v0.0.14 // indirect
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/spf13/pflag v1.0.5 // indirect
golang.org/x/sys v0.12.0 // indirect
)
36 changes: 24 additions & 12 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,14 +1,26 @@
github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY=
github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0=
github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0=
github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

0 comments on commit b7ed6eb

Please sign in to comment.