From e6529b30ec934f285d57dc16dd8acbbab074f102 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Tue, 29 Dec 2015 15:00:57 +0100 Subject: sys: add union type --- prog/encoding.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'prog/encoding.go') diff --git a/prog/encoding.go b/prog/encoding.go index 47addb5ef..b9bd1ce16 100644 --- a/prog/encoding.go +++ b/prog/encoding.go @@ -109,6 +109,9 @@ func (a *Arg) serialize(buf io.Writer, vars map[*Arg]int, varSeq *int) { a1.serialize(buf, vars, varSeq) } buf.Write([]byte{delims[1]}) + case ArgUnion: + fmt.Fprintf(buf, "@%v=", a.OptionType.Name()) + a.Option.serialize(buf, vars, varSeq) default: panic("unknown arg kind") } @@ -306,6 +309,29 @@ func parseArg(typ sys.Type, p *parser, vars map[string]*Arg) (*Arg, error) { } p.Parse(']') arg = groupArg(inner) + case '@': + t1, ok := typ.(sys.UnionType) + if !ok { + return nil, fmt.Errorf("'@' arg is not a union: %#v", typ) + } + p.Parse('@') + name := p.Ident() + p.Parse('=') + var optType sys.Type + for _, t2 := range t1.Options { + if name == t2.Name() { + optType = t2 + break + } + } + if optType == nil { + return nil, fmt.Errorf("union arg %v has unknown option: %v", typ.Name(), name) + } + opt, err := parseArg(optType, p, vars) + if err != nil { + return nil, err + } + arg = unionArg(opt, optType) case 'n': p.Parse('n') p.Parse('i') -- cgit mrf-deployment