Add support for JSON output

This commit is contained in:
Jan Philipp Timme 2018-12-31 21:22:23 +01:00
parent 92a709d196
commit 3d893015a3
2 changed files with 17 additions and 5 deletions

12
main.go
View File

@ -29,13 +29,13 @@ func parseArguments() {
mailqCommandPtr := flag.String("mailqCommand", "mailq", "Command to use for getting mailq output") mailqCommandPtr := flag.String("mailqCommand", "mailq", "Command to use for getting mailq output")
mailqCommandArgsPtr := flag.String("mailqCommandArgs", "", "Optional arguments to pass to mailqCommand") mailqCommandArgsPtr := flag.String("mailqCommandArgs", "", "Optional arguments to pass to mailqCommand")
interactivePtr := flag.Bool("interactive", false, "Set to true for shell mode") interactivePtr := flag.Bool("interactive", false, "Set to true for shell mode")
machineFormatPtr := flag.Bool("machineFormat", false, "Set to true to get output suitable for cut/awk/...") outputFormatPtr := flag.String("outputFormat", "human", "Available output formats: \"human\", \"machine\", \"json\"")
usePagerPtr := flag.Bool("usePager", true, "Use pager to display output?") usePagerPtr := flag.Bool("usePager", true, "Use pager to display output?")
flag.Parse() flag.Parse()
settings["mailqCommand"] = *mailqCommandPtr settings["mailqCommand"] = *mailqCommandPtr
settings["mailqCommandArgs"] = *mailqCommandArgsPtr settings["mailqCommandArgs"] = *mailqCommandArgsPtr
settings["interactive"] = strconv.FormatBool(*interactivePtr) settings["interactive"] = strconv.FormatBool(*interactivePtr)
settings["machineFormat"] = strconv.FormatBool(*machineFormatPtr) settings["outputFormat"] = *outputFormatPtr
settings["usePager"] = strconv.FormatBool(*usePagerPtr) settings["usePager"] = strconv.FormatBool(*usePagerPtr)
} }
@ -63,10 +63,12 @@ func showQueue() {
} }
func printQueue(queue parser.MailQ, writer io.Writer) { func printQueue(queue parser.MailQ, writer io.Writer) {
if settings["machineFormat"] == "true" { if settings["outputFormat"] == "human" {
queue.PrintMachineReadable(writer)
} else {
queue.PrintHumanReadable(writer) queue.PrintHumanReadable(writer)
} else if settings["outputFormat"] == "machine" {
queue.PrintMachineReadable(writer)
} else if settings["outputFormat"] == "json" {
queue.PrintJSON(writer)
} }
} }

View File

@ -2,6 +2,7 @@ package parser
import ( import (
"bufio" "bufio"
"encoding/json"
"errors" "errors"
"fmt" "fmt"
"io" "io"
@ -76,6 +77,15 @@ func (queue MailQ) PrintHumanReadable(writer io.Writer) {
} }
} }
func (queue MailQ) PrintJSON(writer io.Writer) {
bytes, err := json.Marshal(queue)
if err != nil {
fmt.Fprintf(writer, "Error encoding queue to JSON: %s\n", err.Error())
} else {
fmt.Fprintf(writer, "%s", bytes)
}
}
func ParseMailQ(dataSource io.Reader) (MailQ, error) { func ParseMailQ(dataSource io.Reader) (MailQ, error) {
const dateFormat = "2006 Mon Jan _2 15:04:05" const dateFormat = "2006 Mon Jan _2 15:04:05"
var messageIdStart = regexp.MustCompile("^[0-9A-Za-z]+[*!]? ") var messageIdStart = regexp.MustCompile("^[0-9A-Za-z]+[*!]? ")