update input/outpu

This commit is contained in:
2020-10-25 19:20:19 +03:00
parent 1c7e9623ce
commit 8886872c77
41 changed files with 660 additions and 613 deletions

22
output/formatter.go Normal file
View File

@@ -0,0 +1,22 @@
package output
import (
"context"
"gitoa.ru/go-4devs/console/output/formatter"
"gitoa.ru/go-4devs/console/output/verbosity"
)
func Format(out Output, format *formatter.Formatter) Output {
return func(ctx context.Context, v verbosity.Verbosity, msg string, kv ...KeyValue) (int, error) {
return out(ctx, v, format.Format(ctx, msg), kv...)
}
}
func Ansi(out Output) Output {
return Format(out, formatter.Ansi())
}
func None(out Output) Output {
return Format(out, formatter.None())
}

View File

@@ -5,76 +5,70 @@ import (
"fmt"
"io"
"os"
"gitoa.ru/go-4devs/console/output/verbosity"
)
type Verbosity int
const (
VerbosityQuiet Verbosity = iota - 1
VerbosityNorm
VerbosityInfo
VerbosityDebug
VerbosityTrace
)
func writeError(n int, err error) {
fmt.Fprint(os.Stderr, err)
func writeError(_ int, err error) {
if err != nil {
fmt.Fprint(os.Stderr, err)
}
}
type Output func(ctx context.Context, verb Verbosity, msg string, args ...KeyValue) (int, error)
type Output func(ctx context.Context, verb verbosity.Verbosity, msg string, args ...KeyValue) (int, error)
func (o Output) Print(ctx context.Context, args ...interface{}) {
writeError(o(ctx, VerbosityNorm, fmt.Sprint(args...)))
writeError(o(ctx, verbosity.Norm, fmt.Sprint(args...)))
}
func (o Output) PrintKV(ctx context.Context, msg string, kv ...KeyValue) {
writeError(o(ctx, VerbosityNorm, msg, kv...))
writeError(o(ctx, verbosity.Norm, msg, kv...))
}
func (o Output) Printf(ctx context.Context, format string, args ...interface{}) {
writeError(o(ctx, VerbosityNorm, fmt.Sprintf(format, args...)))
writeError(o(ctx, verbosity.Norm, fmt.Sprintf(format, args...)))
}
func (o Output) Println(ctx context.Context, args ...interface{}) {
writeError(o(ctx, VerbosityNorm, fmt.Sprintln(args...)))
writeError(o(ctx, verbosity.Norm, fmt.Sprintln(args...)))
}
func (o Output) Info(ctx context.Context, args ...interface{}) {
writeError(o(ctx, VerbosityInfo, fmt.Sprint(args...)))
writeError(o(ctx, verbosity.Info, fmt.Sprint(args...)))
}
func (o Output) InfoKV(ctx context.Context, msg string, kv ...KeyValue) {
writeError(o(ctx, VerbosityInfo, msg, kv...))
writeError(o(ctx, verbosity.Info, msg, kv...))
}
func (o Output) Debug(ctx context.Context, args ...interface{}) {
writeError(o(ctx, VerbosityDebug, fmt.Sprint(args...)))
writeError(o(ctx, verbosity.Debug, fmt.Sprint(args...)))
}
func (o Output) DebugKV(ctx context.Context, msg string, kv ...KeyValue) {
writeError(o(ctx, VerbosityDebug, msg, kv...))
writeError(o(ctx, verbosity.Debug, msg, kv...))
}
func (o Output) Trace(ctx context.Context, args ...interface{}) {
writeError(o(ctx, VerbosityTrace, fmt.Sprint(args...)))
writeError(o(ctx, verbosity.Trace, fmt.Sprint(args...)))
}
func (o Output) TraceKV(ctx context.Context, msg string, kv ...KeyValue) {
writeError(o(ctx, VerbosityTrace, msg, kv...))
writeError(o(ctx, verbosity.Trace, msg, kv...))
}
func (o Output) Write(b []byte) (int, error) {
return o(context.Background(), VerbosityNorm, string(b))
return o(context.Background(), verbosity.Norm, string(b))
}
func (o Output) Writer(ctx context.Context, verb Verbosity) io.Writer {
func (o Output) Writer(ctx context.Context, verb verbosity.Verbosity) io.Writer {
return verbosityWriter{ctx, o, verb}
}
type verbosityWriter struct {
ctx context.Context
out Output
verb Verbosity
verb verbosity.Verbosity
}
func (w verbosityWriter) Write(b []byte) (int, error) {

13
output/quiet.go Normal file
View File

@@ -0,0 +1,13 @@
package output
import (
"context"
"gitoa.ru/go-4devs/console/output/verbosity"
)
func Quiet() Output {
return func(context.Context, verbosity.Verbosity, string, ...KeyValue) (int, error) {
return 0, nil
}
}

17
output/verbosity.go Normal file
View File

@@ -0,0 +1,17 @@
package output
import (
"context"
"gitoa.ru/go-4devs/console/output/verbosity"
)
func Verbosity(out Output, verb verbosity.Verbosity) Output {
return func(ctx context.Context, v verbosity.Verbosity, msg string, kv ...KeyValue) (int, error) {
if verb >= v {
return out(ctx, v, msg, kv...)
}
return 0, nil
}
}

View File

@@ -1,23 +0,0 @@
package verbosity
import (
"context"
"gitoa.ru/go-4devs/console/output"
)
func Verb(out output.Output, verb output.Verbosity) output.Output {
return func(ctx context.Context, v output.Verbosity, msg string, kv ...output.KeyValue) (int, error) {
if verb >= v {
return out(ctx, v, msg, kv...)
}
return 0, nil
}
}
func Quiet() output.Output {
return func(context.Context, output.Verbosity, string, ...output.KeyValue) (int, error) {
return 0, nil
}
}

View File

@@ -0,0 +1,13 @@
package verbosity
//go:generate stringer -type=Verbosity -linecomment
type Verbosity int
const (
Quiet Verbosity = iota - 1 // quiet
Norm // norm
Info // info
Debug // debug
Trace // trace
)

View File

@@ -0,0 +1,28 @@
// Code generated by "stringer -type=Verbosity -linecomment"; DO NOT EDIT.
package verbosity
import "strconv"
func _() {
// An "invalid array index" compiler error signifies that the constant values have changed.
// Re-run the stringer command to generate them again.
var x [1]struct{}
_ = x[Quiet - -1]
_ = x[Norm-0]
_ = x[Info-1]
_ = x[Debug-2]
_ = x[Trace-3]
}
const _Verbosity_name = "quietnorminfodebugtrace"
var _Verbosity_index = [...]uint8{0, 5, 9, 13, 18, 23}
func (i Verbosity) String() string {
i -= -1
if i < 0 || i >= Verbosity(len(_Verbosity_index)-1) {
return "Verbosity(" + strconv.FormatInt(int64(i+-1), 10) + ")"
}
return _Verbosity_name[_Verbosity_index[i]:_Verbosity_index[i+1]]
}

View File

@@ -1,22 +0,0 @@
package wrap
import (
"context"
"gitoa.ru/go-4devs/console/output"
"gitoa.ru/go-4devs/console/output/formatter"
)
func Format(out output.Output, format *formatter.Formatter) output.Output {
return func(ctx context.Context, v output.Verbosity, msg string, kv ...output.KeyValue) (int, error) {
return out(ctx, v, format.Format(ctx, msg), kv...)
}
}
func Ansi(out output.Output) output.Output {
return Format(out, formatter.Ansi())
}
func None(out output.Output) output.Output {
return Format(out, formatter.None())
}

45
output/writer.go Normal file
View File

@@ -0,0 +1,45 @@
package output
import (
"bytes"
"context"
"fmt"
"io"
"os"
"strings"
"gitoa.ru/go-4devs/console/output/verbosity"
)
const newline = "\n"
func Stderr() Output {
return New(os.Stderr, FormatString)
}
func Stdout() Output {
return New(os.Stdout, FormatString)
}
func Buffer(buf *bytes.Buffer) Output {
return New(buf, FormatString)
}
func FormatString(_ verbosity.Verbosity, msg string, kv ...KeyValue) string {
if len(kv) > 0 {
nline := ""
if msg[len(msg)-1:] == newline {
nline = newline
}
return "msg=\"" + strings.TrimSpace(msg) + "\", " + KeyValues(kv).String() + nline
}
return msg
}
func New(w io.Writer, format func(verb verbosity.Verbosity, msg string, kv ...KeyValue) string) Output {
return func(ctx context.Context, verb verbosity.Verbosity, msg string, kv ...KeyValue) (int, error) {
return fmt.Fprint(w, format(verb, msg, kv...))
}
}

View File

@@ -1,45 +0,0 @@
package writer
import (
"bytes"
"context"
"fmt"
"io"
"os"
"strings"
"gitoa.ru/go-4devs/console/output"
)
const newline = "\n"
func Stderr() output.Output {
return New(os.Stderr, String)
}
func Stdout() output.Output {
return New(os.Stdout, String)
}
func Buffer(buf *bytes.Buffer) output.Output {
return New(buf, String)
}
func String(_ output.Verbosity, msg string, kv ...output.KeyValue) string {
if len(kv) > 0 {
nline := ""
if msg[len(msg)-1:] == newline {
nline = newline
}
return "msg=\"" + strings.TrimSpace(msg) + "\", " + output.KeyValues(kv).String() + nline
}
return msg
}
func New(w io.Writer, format func(verb output.Verbosity, msg string, kv ...output.KeyValue) string) output.Output {
return func(ctx context.Context, verb output.Verbosity, msg string, kv ...output.KeyValue) (int, error) {
return fmt.Fprint(w, format(verb, msg, kv...))
}
}

View File

@@ -1,4 +1,4 @@
package writer_test
package output_test
import (
"bytes"
@@ -6,13 +6,12 @@ import (
"testing"
"gitoa.ru/go-4devs/console/output"
"gitoa.ru/go-4devs/console/output/writer"
)
func TestNew(t *testing.T) {
ctx := context.Background()
buf := bytes.Buffer{}
wr := writer.New(&buf, writer.String)
wr := output.New(&buf, output.FormatString)
cases := map[string]struct {
ex string