Playing with logfmt go k=v parser library
package main | |
import ( | |
"fmt" | |
"strconv" | |
"github.com/davecgh/go-spew/spew" | |
"github.com/kr/logfmt" | |
) | |
// base test case | |
const t0 = `foo=bar` | |
// string, int, float, bool | |
const t1 = `foo=bar baz=3 fl=3.1415926535 bl=true` | |
// value has multiple words, unquoted | |
const t2 = `foo=bar ben=one two baz=3` | |
// value has a quoted string with spaces and an equals sign | |
const t3 = `foo=bar eq="a test with = signs" baz=3` | |
// value has an unquoted sign with no spaces but an equals sign | |
const t4 = `foo=bar unq=astr=with=equals?and*stuff baz=3` | |
func parseIntoMap(m map[string]interface{}, line []byte) error { | |
f := func(key, val []byte) error { | |
keyStr := string(key) | |
valStr := string(val) | |
if b, err := strconv.ParseBool(valStr); err == nil { | |
m[keyStr] = b | |
return nil | |
} | |
if i, err := strconv.Atoi(valStr); err == nil { | |
m[keyStr] = i | |
return nil | |
} | |
if f, err := strconv.ParseFloat(valStr, 64); err == nil { | |
m[keyStr] = f | |
return nil | |
} | |
m[keyStr] = valStr | |
return nil | |
} | |
handler := logfmt.HandlerFunc(f) | |
return logfmt.Unmarshal(line, handler) | |
} | |
func main() { | |
for i, str := range []string{t0, t1, t2, t3, t4} { | |
m := make(map[string]interface{}) | |
parseIntoMap(m, []byte(str)) | |
fmt.Printf("%d: `%s`\n", i, str) | |
spew.Dump(m) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment