Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

generate const values for enumerations #140

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions xsdgen/cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,14 +55,17 @@ func (cfg *Config) GenCode(data ...[]byte) (*Code, error) {
// associated methods based on a set of XML schema.
func (cfg *Config) GenAST(files ...string) (*ast.File, error) {
data, err := cfg.readFiles(files...)
if err != nil {
return nil, err
}
code, err := cfg.GenCode(data...)
if err != nil {
return nil, err
}
return code.GenAST()
}

func (cfg *Config) readFiles(files ...string) ([][]byte,error) {
func (cfg *Config) readFiles(files ...string) ([][]byte, error) {
data := make([][]byte, 0, len(files))
for _, filename := range files {
b, err := ioutil.ReadFile(filename)
Expand All @@ -83,10 +86,8 @@ func (cfg *Config) readFiles(files ...string) ([][]byte,error) {
if err != nil {
return nil, fmt.Errorf("error reading imported files: %v", err)
}
for _, d := range referencedData {
// prepend imported refs (i.e. append before the referencing file)
data = append(data, d)
}
// prepend imported refs (i.e. append before the referencing file)
data = append(data, referencedData...)
}
data = append(data, b)
}
Expand Down
214 changes: 214 additions & 0 deletions xsdgen/testdata/base64.go.golden
Original file line number Diff line number Diff line change
@@ -0,0 +1,214 @@
// Code generated by xsdgen.test. DO NOT EDIT.

package ws

import (
"bytes"
"encoding/base64"
"encoding/xml"
"time"
)

type MyType1 []byte

func (t *MyType1) UnmarshalText(text []byte) error {
return (*xsdBase64Binary)(t).UnmarshalText(text)
}
func (t MyType1) MarshalText() ([]byte, error) {
return xsdBase64Binary(t).MarshalText()
}

type MyType2 struct {
Value []byte `xml:",chardata"`
Length int `xml:"length,attr,omitempty"`
}

func (t *MyType2) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
type T MyType2
var layout struct {
*T
Value *xsdBase64Binary `xml:",chardata"`
}
layout.T = (*T)(t)
layout.Value = (*xsdBase64Binary)(&layout.T.Value)
return e.EncodeElement(layout, start)
}
func (t *MyType2) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
type T MyType2
var overlay struct {
*T
Value *xsdBase64Binary `xml:",chardata"`
}
overlay.T = (*T)(t)
overlay.Value = (*xsdBase64Binary)(&overlay.T.Value)
return d.DecodeElement(&overlay, &start)
}

type MyType3 struct {
Value time.Time `xml:",chardata"`
Length int `xml:"length,attr,omitempty"`
}

func (t *MyType3) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
type T MyType3
var layout struct {
*T
Value *xsdDate `xml:",chardata"`
}
layout.T = (*T)(t)
layout.Value = (*xsdDate)(&layout.T.Value)
return e.EncodeElement(layout, start)
}
func (t *MyType3) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
type T MyType3
var overlay struct {
*T
Value *xsdDate `xml:",chardata"`
}
overlay.T = (*T)(t)
overlay.Value = (*xsdDate)(&overlay.T.Value)
return d.DecodeElement(&overlay, &start)
}

type MyType4 struct {
Title string `xml:"http://example.org/ title"`
Blob []byte `xml:"http://example.org/ blob"`
Timestamp time.Time `xml:"http://example.org/ timestamp"`
}

func (t *MyType4) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
type T MyType4
var layout struct {
*T
Blob *xsdBase64Binary `xml:"http://example.org/ blob"`
Timestamp *xsdDateTime `xml:"http://example.org/ timestamp"`
}
layout.T = (*T)(t)
layout.Blob = (*xsdBase64Binary)(&layout.T.Blob)
layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp)
return e.EncodeElement(layout, start)
}
func (t *MyType4) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
type T MyType4
var overlay struct {
*T
Blob *xsdBase64Binary `xml:"http://example.org/ blob"`
Timestamp *xsdDateTime `xml:"http://example.org/ timestamp"`
}
overlay.T = (*T)(t)
overlay.Blob = (*xsdBase64Binary)(&overlay.T.Blob)
overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp)
return d.DecodeElement(&overlay, &start)
}

type MyType5 time.Time

func (t *MyType5) UnmarshalText(text []byte) error {
return (*xsdGDay)(t).UnmarshalText(text)
}
func (t MyType5) MarshalText() ([]byte, error) {
return xsdGDay(t).MarshalText()
}

type xsdBase64Binary []byte

func (b *xsdBase64Binary) UnmarshalText(text []byte) (err error) {
*b, err = base64.StdEncoding.DecodeString(string(text))
return
}
func (b xsdBase64Binary) MarshalText() ([]byte, error) {
var buf bytes.Buffer
enc := base64.NewEncoder(base64.StdEncoding, &buf)
enc.Write([]byte(b))
enc.Close()
return buf.Bytes(), nil
}

type xsdDate time.Time

func (t *xsdDate) UnmarshalText(text []byte) error {
return _unmarshalTime(text, (*time.Time)(t), "2006-01-02")
}
func (t xsdDate) MarshalText() ([]byte, error) {
return _marshalTime((time.Time)(t), "2006-01-02")
}
func (t xsdDate) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
if (time.Time)(t).IsZero() {
return nil
}
m, err := t.MarshalText()
if err != nil {
return err
}
return e.EncodeElement(m, start)
}
func (t xsdDate) MarshalXMLAttr(name xml.Name) (xml.Attr, error) {
if (time.Time)(t).IsZero() {
return xml.Attr{}, nil
}
m, err := t.MarshalText()
return xml.Attr{Name: name, Value: string(m)}, err
}
func _unmarshalTime(text []byte, t *time.Time, format string) (err error) {
s := string(bytes.TrimSpace(text))
*t, err = time.Parse(format, s)
if _, ok := err.(*time.ParseError); ok {
*t, err = time.Parse(format+"Z07:00", s)
}
return err
}
func _marshalTime(t time.Time, format string) ([]byte, error) {
return []byte(t.Format(format + "Z07:00")), nil
}

type xsdDateTime time.Time

func (t *xsdDateTime) UnmarshalText(text []byte) error {
return _unmarshalTime(text, (*time.Time)(t), "2006-01-02T15:04:05.999999999")
}
func (t xsdDateTime) MarshalText() ([]byte, error) {
return _marshalTime((time.Time)(t), "2006-01-02T15:04:05.999999999")
}
func (t xsdDateTime) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
if (time.Time)(t).IsZero() {
return nil
}
m, err := t.MarshalText()
if err != nil {
return err
}
return e.EncodeElement(m, start)
}
func (t xsdDateTime) MarshalXMLAttr(name xml.Name) (xml.Attr, error) {
if (time.Time)(t).IsZero() {
return xml.Attr{}, nil
}
m, err := t.MarshalText()
return xml.Attr{Name: name, Value: string(m)}, err
}

type xsdGDay time.Time

func (t *xsdGDay) UnmarshalText(text []byte) error {
return _unmarshalTime(text, (*time.Time)(t), "---02")
}
func (t xsdGDay) MarshalText() ([]byte, error) {
return _marshalTime((time.Time)(t), "---02")
}
func (t xsdGDay) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
if (time.Time)(t).IsZero() {
return nil
}
m, err := t.MarshalText()
if err != nil {
return err
}
return e.EncodeElement(m, start)
}
func (t xsdGDay) MarshalXMLAttr(name xml.Name) (xml.Attr, error) {
if (time.Time)(t).IsZero() {
return xml.Attr{}, nil
}
m, err := t.MarshalText()
return xml.Attr{Name: name, Value: string(m)}, err
}
34 changes: 34 additions & 0 deletions xsdgen/testdata/enumeration.go.golden
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// Code generated by xsdgen.test. DO NOT EDIT.

package ws

// May be one of MON, TUE, WED, THU, FRI, SAT, SUN
type DType string

const (
DType_MON DType = "MON"
DType_TUE DType = "TUE"
DType_WED DType = "WED"
DType_THU DType = "THU"
DType_FRI DType = "FRI"
DType_SAT DType = "SAT"
DType_SUN DType = "SUN"
)

// May be one of 0.9, 0.333333333, 0.0
type FloatType float64

const (
FloatType_0_9 FloatType = 0.9
FloatType_0_333333333 FloatType = 0.333333333
FloatType_0_0 FloatType = 0.0
)

// May be one of 1, 2, 3
type IntType int

const (
IntType_1 IntType = 1
IntType_2 IntType = 2
IntType_3 IntType = 3
)
42 changes: 42 additions & 0 deletions xsdgen/testdata/enumeration.xsd
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://example.org/" targetNamespace="http://example.org/">

<xs:simpleType name="dType">
<xs:annotation>
<xs:documentation>type for weekday</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:enumeration value="MON"/>
<xs:enumeration value="TUE"/>
<xs:enumeration value="WED"/>
<xs:enumeration value="THU"/>
<xs:enumeration value="FRI"/>
<xs:enumeration value="SAT"/>
<xs:enumeration value="SUN"/>
</xs:restriction>
</xs:simpleType>

<xs:simpleType name="intType">
<xs:annotation>
<xs:documentation>integer enum</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:integer">
<xs:enumeration value="1"/>
<xs:enumeration value="2"/>
<xs:enumeration value="3"/>
</xs:restriction>
</xs:simpleType>

<xs:simpleType name="floatType">
<xs:annotation>
<xs:documentation>float enum</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:decimal">
<xs:enumeration value="0.9"/>
<xs:enumeration value="0.333333333"/>
<xs:enumeration value="0.0"/>
</xs:restriction>
</xs:simpleType>

</xs:schema>
Loading