Skip to content

katydid/parser-go-reflect

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

parser-go-reflect

Reflection based parser for Go.

We can dynamically walk over reflecting Go structs using the Parser interface:

import (
    "reflect"
    "io"

    reflectparser "github.com/katydid/parser-go-reflect/reflect"
)

func main() {
    reflectParser := reflectparser.NewReflectParser()
    s := &MyStruct{MyField: "myvalue", OtherField: "othervalue"}
    v := reflect.ValueOf(s)
    reflectParser.Init(v)
    myvalue, err := GetMyField("MyField")
    if err != nil {
        panic(err)
    }
    println(myvalue)
}

We can then use the parser to decode only MyField and skip over other fields and return "myvalue":

func GetMyField(p parser.Interface) (string, error) {
	for {
		if err := p.Next(); err != nil {
			if err == io.EOF {
				break
			} else {
				return "", err
			}
		}
		fieldName, err := p.String()
		if err != nil {
			return "", err
		}
		if fieldName != "MyField" {
			continue
		}
		p.Down()
		if err := p.Next(); err != nil {
			if err == io.EOF {
				break
			} else {
				return "", err
			}
		}
		return p.String()
	}
	return "", nil
}