From aa63b97c0879642e3a523e2de53d2a1151648f23 Mon Sep 17 00:00:00 2001
From: Carolina Fernandez <carolinasolfernandez@gmail.com>
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 {