Code cleanup

This commit is contained in:
Adriano Caloiaro 2019-10-27 15:41:52 -04:00
parent 343977cd76
commit 0b7fecddd3
No known key found for this signature in database
GPG key ID: 9FFD0E7601F166AB

100
struct.go
View file

@ -10,15 +10,25 @@ import (
"strings" "strings"
) )
const (
defaultFieldSeparator = " "
defaultOutput = "string"
fieldsUsage = "comma-separated list of fields corresponding to the input data's fields\n\n" +
"Example\n\n" +
"$ echo \"foo1 bar1\" | struct -fields foo,bar\n" +
"$ foo:foo1 bar:bar1\n"
outputUsage = "the desired output format: json or string"
separatorUsage = "the character that separates fields in the input data"
)
var (
fieldsFlag fields // a comma-separated list of fields provided by the user
outFlag string // the format (either string or json) in which to structure data
sepFlag string // a string on which to split lines of input
)
type fields []string type fields []string
var fieldsFlag fields
var sepFlag string
var outFlag string
var in string
var fieldsProvided int
func (f *fields) String() string { func (f *fields) String() string {
return fmt.Sprint(*f) return fmt.Sprint(*f)
} }
@ -35,51 +45,50 @@ func (f *fields) Set(value string) error {
return nil return nil
} }
const (
defaultFieldSeparator = " "
defaultOutput = "string"
fieldsUsage = "comma-separated list of fields corresponding to the input data's fields\n\n" +
"Example\n\n" +
"$ echo \"foo1 bar1\" | struct -fields foo,bar\n" +
"$ foo:foo1 bar:bar1\n"
outputUsage = "the desired output format: json or string"
separatorUsage = "the character that separates fields in the input data"
)
func init() { func init() {
flag.Var(&fieldsFlag, "fields", fieldsUsage) flagset := flag.CommandLine
flag.StringVar(&sepFlag, "separator", defaultFieldSeparator, separatorUsage) flagset.Var(&fieldsFlag, "fields", fieldsUsage)
flag.StringVar(&outFlag, "output", defaultOutput, outputUsage) flagset.StringVar(&sepFlag, "separator", defaultFieldSeparator, separatorUsage)
setupFlags(flag.CommandLine) flagset.StringVar(&outFlag, "output", defaultOutput, outputUsage)
flag.Parse() flagset.Usage = func() {
fmt.Println("\nCreate structured output from unstructured input")
flagset.PrintDefaults()
}
flagset.Parse(os.Args[1:])
} }
func setupFlags(f *flag.FlagSet) { func setupFlags(f *flag.FlagSet) {
f.Usage = func() {
fmt.Println("\nCreate structured data input strings")
f.PrintDefaults()
}
} }
var sb strings.Builder var sb strings.Builder
var jsonMap = make(map[string]string) var jsonMap = make(map[string]string)
func main() { func main() {
fieldsProvided = len(fieldsFlag) fieldsProvided := len(fieldsFlag)
scanner := bufio.NewScanner(os.Stdin) scanner := bufio.NewScanner(os.Stdin)
var i int var i int
var field, v string var field, in, v string
// perform a line-wise scan over stdin until EOF
for scanner.Scan() { for scanner.Scan() {
in = scanner.Text() in = scanner.Text()
inputFields := strings.Fields(in) // if the separator string is overridden, split on it instead of the default of splitting on space
var inputFields []string
if sepFlag != defaultFieldSeparator {
inputFields = strings.Split(in, sepFlag)
} else {
inputFields = strings.Fields(in)
}
// for every field to be retained from the input, build a representation of it in the output
for i, v = range inputFields { for i, v = range inputFields {
if i < fieldsProvided { if i < fieldsProvided {
@ -88,7 +97,10 @@ func main() {
field = "" field = ""
} }
buildOutput(field, v) if err := buildOutput(field, v); err != nil {
fmt.Println(err.Error())
return
}
} }
fmt.Println(out()) fmt.Println(out())
@ -96,32 +108,36 @@ func main() {
} }
func out() (out string) { func out() (out string) {
if outFlag == "string" {
switch outFlag {
case "string":
out = sb.String() out = sb.String()
sb.Reset() sb.Reset()
} else if outFlag == "json" { case "json":
o, _ := json.Marshal(jsonMap) o, _ := json.Marshal(jsonMap)
out = string(o) out = string(o)
for k := range jsonMap { for k := range jsonMap {
delete(jsonMap, k) delete(jsonMap, k)
} }
} else { default:
out = "" out = ""
} }
return return
} }
func buildOutput(field, value string) error { func buildOutput(field, value string) (err error) {
if outFlag == "string" { switch outFlag {
case "string":
buildString(field, value) buildString(field, value)
} else if outFlag == "json" { case "json":
buildJSON(field, value) buildJSON(field, value)
} else { default:
return errors.New("invalid output option") err = fmt.Errorf("invalid -output option: %s", outFlag)
return
} }
return nil return
} }
func buildString(field, value string) { func buildString(field, value string) {
@ -129,10 +145,10 @@ func buildString(field, value string) {
sb.WriteString(field) sb.WriteString(field)
sb.WriteString(":") sb.WriteString(":")
sb.WriteString(value) sb.WriteString(value)
sb.WriteString(sepFlag) sb.WriteString(defaultFieldSeparator)
} else { } else {
sb.WriteString(value) sb.WriteString(value)
sb.WriteString(sepFlag) sb.WriteString(defaultFieldSeparator)
} }
} }