From aa63b97c0879642e3a523e2de53d2a1151648f23 Mon Sep 17 00:00:00 2001 From: Carolina Fernandez Date: Mon, 8 Jun 2020 20:15:53 -0300 Subject: [PATCH] add marshal for one element in enum --- xsdgen/xsdgen.go | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/xsdgen/xsdgen.go b/xsdgen/xsdgen.go index 81df33a..b613945 100644 --- a/xsdgen/xsdgen.go +++ b/xsdgen/xsdgen.go @@ -870,6 +870,11 @@ func (cfg *Config) genSimpleType(t *xsd.SimpleType) ([]spec, error) { if t.List { return cfg.genSimpleListSpec(t) } + + if len(t.Restriction.Enum) == 1 { + return cfg.genEnumOneValue(t) + } + if len(t.Union) > 0 { // We don't support unions because the code that needs // to be generated to check which of the member types @@ -1167,6 +1172,41 @@ func (cfg *Config) genSimpleListSpec(t *xsd.SimpleType) ([]spec, error) { return []spec{s}, nil } +// Generate a type declaration for a enum type with one element, along with marshal +// methods. +func (cfg *Config) genEnumOneValue(t *xsd.SimpleType) ([]spec, error) { + cfg.debugf("generating Go source for enum with one element %q", xsd.XMLName(t).Local) + + if len(t.Restriction.Enum) != 1 { + return nil, nil + } + + expr, err := cfg.expr(t.Base) + if err != nil { + return nil, err + } + s := spec{ + doc: t.Doc, + name: cfg.public(t.Name), + expr: expr, + xsdType: t, + } + marshal, err := gen.Func("MarshalText"). + Receiver("x *"+s.name). + Returns("[]byte", "error"). + Body(` + return []byte("` + t.Restriction.Enum[0] + `"), nil + `).Decl() + + if err != nil { + return nil, fmt.Errorf("MarshalText %s: %v", s.name, err) + } + + s.methods = append(s.methods, marshal) + + return []spec{s}, nil +} + // O(n²) is OK since you'll never see more than ~40 attributes... // right? func mergeAttributes(src, base *xsd.ComplexType) []xsd.Attribute {