From e6acf6c41c56e175a2f94313b1f76ebfc9c6278d Mon Sep 17 00:00:00 2001 From: Gregory Eremin Date: Wed, 11 Feb 2015 01:24:29 +0700 Subject: [PATCH] Chain parser --- core/parser.go | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 core/parser.go diff --git a/core/parser.go b/core/parser.go new file mode 100644 index 0000000..1b8e27d --- /dev/null +++ b/core/parser.go @@ -0,0 +1,58 @@ +package core + +import ( + "encoding/json" + "fmt" + "reflect" +) + +func ParseChains(b []byte) (map[string]*Chain, error) { + var schema map[string]interface{} + if err := json.Unmarshal(b, &schema); err != nil { + return nil, err + } + + chains := map[string]*Chain{} + for name, chain := range schema { + chains[name] = buildChain(interface{}(chain)) + } + + return chains, nil +} + +func buildChain(conf interface{}) *Chain { + c := &Chain{ + Links: []Caller{}, + } + + for flow, links := range conf.(map[string]interface{}) { + if f, ok := FlowMap[flow]; ok { + c.Flow = f + } else { + panic("Unknown chain flow: " + flow) + } + + for _, link := range links.([]interface{}) { + val := reflect.ValueOf(link) + + switch val.Kind() { + case reflect.Map: + subchain := buildChain(interface{}(link)) + if len(subchain.Links) > 0 { + c.Links = append(c.Links, Caller(subchain)) + } + case reflect.String: + unit, ok := Units[link.(string)] + if !ok { + fmt.Println("Unknown unit `" + link.(string) + "`") + } else { + c.Links = append(c.Links, unit) + } + default: + panic("Unexpected chain element: " + val.Kind().String()) + } + } + } + + return c +}