Codegen: Add support for noms types

This makes it possible to do a List of Bool or Map of Int32 etc
This commit is contained in:
Erik Arvidsson
2015-07-22 12:10:40 -07:00
parent 5b8d2a1d47
commit 3fdc008f5c
18 changed files with 141 additions and 50 deletions

View File

@@ -34,34 +34,39 @@ func (s User) Equals(p User) bool {
func (s User) Ref() ref.Ref {
return s.m.Ref()
}
func (s User) OAuthToken() types.String {
return s.m.Get(types.NewString("oAuthToken")).(types.String)
return types.StringFromVal(s.m.Get(types.NewString("oAuthToken")))
}
func (s User) SetOAuthToken(p types.String) User {
return UserFromVal(s.m.Set(types.NewString("oAuthToken"), p))
}
func (s User) Name() types.String {
return s.m.Get(types.NewString("name")).(types.String)
return types.StringFromVal(s.m.Get(types.NewString("name")))
}
func (s User) SetName(p types.String) User {
return UserFromVal(s.m.Set(types.NewString("name"), p))
}
func (s User) Id() types.String {
return s.m.Get(types.NewString("id")).(types.String)
return types.StringFromVal(s.m.Get(types.NewString("id")))
}
func (s User) SetId(p types.String) User {
return UserFromVal(s.m.Set(types.NewString("id"), p))
}
func (s User) OAuthSecret() types.String {
return s.m.Get(types.NewString("oAuthSecret")).(types.String)
return types.StringFromVal(s.m.Get(types.NewString("oAuthSecret")))
}
func (s User) SetOAuthSecret(p types.String) User {
return UserFromVal(s.m.Set(types.NewString("oAuthSecret"), p))
}
func (s User) Photosets() PhotosetSet {
return PhotosetSetFromVal(s.m.Get(types.NewString("photosets")))
}
@@ -69,6 +74,7 @@ func (s User) Photosets() PhotosetSet {
func (s User) SetPhotosets(p PhotosetSet) User {
return UserFromVal(s.m.Set(types.NewString("photosets"), p.NomsValue()))
}
// PhotosetSet
type PhotosetSet struct {
@@ -177,20 +183,23 @@ func (s Photoset) Equals(p Photoset) bool {
func (s Photoset) Ref() ref.Ref {
return s.m.Ref()
}
func (s Photoset) Title() types.String {
return s.m.Get(types.NewString("title")).(types.String)
return types.StringFromVal(s.m.Get(types.NewString("title")))
}
func (s Photoset) SetTitle(p types.String) Photoset {
return PhotosetFromVal(s.m.Set(types.NewString("title"), p))
}
func (s Photoset) Id() types.String {
return s.m.Get(types.NewString("id")).(types.String)
return types.StringFromVal(s.m.Get(types.NewString("id")))
}
func (s Photoset) SetId(p types.String) Photoset {
return PhotosetFromVal(s.m.Set(types.NewString("id"), p))
}
func (s Photoset) Photos() PhotoSet {
return PhotoSetFromVal(s.m.Get(types.NewString("photos")))
}
@@ -198,6 +207,7 @@ func (s Photoset) Photos() PhotoSet {
func (s Photoset) SetPhotos(p PhotoSet) Photoset {
return PhotosetFromVal(s.m.Set(types.NewString("photos"), p.NomsValue()))
}
// PhotoSet
type PhotoSet struct {
@@ -306,31 +316,36 @@ func (s Photo) Equals(p Photo) bool {
func (s Photo) Ref() ref.Ref {
return s.m.Ref()
}
func (s Photo) Title() types.String {
return s.m.Get(types.NewString("title")).(types.String)
return types.StringFromVal(s.m.Get(types.NewString("title")))
}
func (s Photo) SetTitle(p types.String) Photo {
return PhotoFromVal(s.m.Set(types.NewString("title"), p))
}
func (s Photo) Id() types.String {
return s.m.Get(types.NewString("id")).(types.String)
return types.StringFromVal(s.m.Get(types.NewString("id")))
}
func (s Photo) SetId(p types.String) Photo {
return PhotoFromVal(s.m.Set(types.NewString("id"), p))
}
func (s Photo) Image() types.Blob {
return s.m.Get(types.NewString("image")).(types.Blob)
return types.BlobFromVal(s.m.Get(types.NewString("image")))
}
func (s Photo) SetImage(p types.Blob) Photo {
return PhotoFromVal(s.m.Set(types.NewString("image"), p))
}
func (s Photo) Url() types.String {
return s.m.Get(types.NewString("url")).(types.String)
return types.StringFromVal(s.m.Get(types.NewString("url")))
}
func (s Photo) SetUrl(p types.String) Photo {
return PhotoFromVal(s.m.Set(types.NewString("url"), p))
}

View File

@@ -102,17 +102,20 @@ func (s Pitch) Equals(p Pitch) bool {
func (s Pitch) Ref() ref.Ref {
return s.m.Ref()
}
func (s Pitch) Z() types.Float64 {
return s.m.Get(types.NewString("Z")).(types.Float64)
return types.Float64FromVal(s.m.Get(types.NewString("Z")))
}
func (s Pitch) SetZ(p types.Float64) Pitch {
return PitchFromVal(s.m.Set(types.NewString("Z"), p))
}
func (s Pitch) X() types.Float64 {
return s.m.Get(types.NewString("X")).(types.Float64)
return types.Float64FromVal(s.m.Get(types.NewString("X")))
}
func (s Pitch) SetX(p types.Float64) Pitch {
return PitchFromVal(s.m.Set(types.NewString("X"), p))
}

View File

@@ -116,17 +116,20 @@ func (s Root) Equals(p Root) bool {
func (s Root) Ref() ref.Ref {
return s.m.Ref()
}
func (s Root) Parents() types.Set {
return s.m.Get(types.NewString("parents")).(types.Set)
return types.SetFromVal(s.m.Get(types.NewString("parents")))
}
func (s Root) SetParents(p types.Set) Root {
return RootFromVal(s.m.Set(types.NewString("parents"), p))
}
func (s Root) Value() types.Value {
return s.m.Get(types.NewString("value")).(types.Value)
return (s.m.Get(types.NewString("value")))
}
func (s Root) SetValue(p types.Value) Root {
return RootFromVal(s.m.Set(types.NewString("value"), p))
}

View File

@@ -116,17 +116,20 @@ func (s Dataset) Equals(p Dataset) bool {
func (s Dataset) Ref() ref.Ref {
return s.m.Ref()
}
func (s Dataset) Id() types.String {
return s.m.Get(types.NewString("id")).(types.String)
return types.StringFromVal(s.m.Get(types.NewString("id")))
}
func (s Dataset) SetId(p types.String) Dataset {
return DatasetFromVal(s.m.Set(types.NewString("id"), p))
}
func (s Dataset) Root() types.Value {
return s.m.Get(types.NewString("root")).(types.Value)
return (s.m.Get(types.NewString("root")))
}
func (s Dataset) SetRoot(p types.Value) Dataset {
return DatasetFromVal(s.m.Set(types.NewString("root"), p))
}

8
nomgen/field.tmpl Normal file
View File

@@ -0,0 +1,8 @@
func (s {{.StructName}}) {{.GoFieldName}}() {{.FieldType}} {
return {{fromVal .FieldType}}(s.m.Get(types.NewString("{{.FieldName}}")))
}
func (s {{.StructName}}) Set{{.GoFieldName}}(p {{.FieldType}}) {{.StructName}} {
return {{fromVal .StructName}}(s.m.Set(types.NewString("{{.FieldName}}"), p{{toVal .FieldType}}))
}

View File

@@ -1,7 +0,0 @@
func (s {{.StructName}}) {{.GoFieldName}}() {{.FieldType}} {
return {{.FieldType}}FromVal(s.m.Get(types.NewString("{{.FieldName}}")))
}
func (s {{.StructName}}) Set{{.GoFieldName}}(p {{.FieldType}}) {{.StructName}} {
return {{.StructName}}FromVal(s.m.Set(types.NewString("{{.FieldName}}"), p.NomsValue()))
}

View File

@@ -1,7 +0,0 @@
func (s {{.StructName}}) {{.GoFieldName}}() {{.FieldType}} {
return s.m.Get(types.NewString("{{.FieldName}}")).({{.FieldType}})
}
func (s {{.StructName}}) Set{{.GoFieldName}}(p {{.FieldType}}) {{.StructName}} {
return {{.StructName}}FromVal(s.m.Set(types.NewString("{{.FieldName}}"), p))
}

View File

@@ -31,7 +31,7 @@ func (l {{.StructName}}) Len() uint64 {
}
func (l {{.StructName}}) Get(idx uint64) {{.ElemName}} {
return {{.ElemName}}FromVal(l.l.Get(idx))
return {{fromVal .ElemName}}(l.l.Get(idx))
}
func (l {{.StructName}}) Slice(idx uint64, end uint64) {{.StructName}} {
@@ -39,7 +39,7 @@ func (l {{.StructName}}) Slice(idx uint64, end uint64) {{.StructName}} {
}
func (l {{.StructName}}) Set(idx uint64, v {{.ElemName}}) {{.StructName}} {
return {{.StructName}}{l.l.Set(idx, v.NomsValue())}
return {{.StructName}}{l.l.Set(idx, v{{toVal .ElemName}})}
}
func (l {{.StructName}}) Append(v ...{{.ElemName}}) {{.StructName}} {
@@ -61,7 +61,7 @@ func (l {{.StructName}}) RemoveAt(idx uint64) {{.StructName}} {
func (l {{.StructName}}) fromElemSlice(p []{{.ElemName}}) []types.Value {
r := make([]types.Value, len(p))
for i, v := range p {
r[i] = v.NomsValue()
r[i] = v{{toVal .ElemName}}
}
return r
}

View File

@@ -15,12 +15,11 @@ import (
)
var (
fieldCompositeTempl = readTemplate("field_composite.tmpl")
fieldPrimitiveTempl = readTemplate("field_primitive.tmpl")
headerTmpl = readTemplate("header.tmpl")
listTempl = readTemplate("list.tmpl")
setTempl = readTemplate("set.tmpl")
structTempl = readTemplate("struct.tmpl")
fieldTempl = readTemplate("field.tmpl")
headerTmpl = readTemplate("header.tmpl")
listTempl = readTemplate("list.tmpl")
setTempl = readTemplate("set.tmpl")
structTempl = readTemplate("struct.tmpl")
)
type NG struct {
@@ -61,6 +60,20 @@ func (ng *NG) addType(val types.Value) {
}
}
func fromNomsValue(name string) string {
if name == "types.Value" {
return ""
}
return fmt.Sprintf("%sFromVal", name)
}
func toNomsValue(name string) string {
if strings.HasPrefix(name, "types.") {
return ""
}
return ".NomsValue()"
}
func readTemplate(name string) *template.Template {
_, thisfile, _, _ := runtime.Caller(1)
f, err := os.Open(path.Join(path.Dir(thisfile), name))
@@ -68,7 +81,10 @@ func readTemplate(name string) *template.Template {
defer f.Close()
b, err := ioutil.ReadAll(f)
Chk.NoError(err)
t, err := template.New(name).Parse(string(b))
t, err := template.New(name).Funcs(template.FuncMap{
"fromVal": fromNomsValue,
"toVal": toNomsValue,
}).Parse(string(b))
Chk.NoError(err)
return t
}
@@ -151,11 +167,7 @@ func (ng *NG) writeField(structName, fieldName string, typeDef types.Value) {
fieldName,
}
if _, ok := typeDef.(types.String); ok {
fieldPrimitiveTempl.Execute(ng.w, data)
} else {
fieldCompositeTempl.Execute(ng.w, data)
}
fieldTempl.Execute(ng.w, data)
}
func getGoTypeName(typeDef types.Value) string {

View File

@@ -35,12 +35,12 @@ func (s {{.StructName}}) Len() uint64 {
}
func (s {{.StructName}}) Has(p {{.ElemName}}) bool {
return s.s.Has(p.NomsValue())
return s.s.Has(p{{toVal .ElemName}})
}
func (s {{.StructName}}) Iter(cb {{.StructName}}IterCallback) {
s.s.Iter(func(v types.Value) bool {
return cb({{.ElemName}}FromVal(v))
return cb({{fromVal .ElemName}}(v))
})
}
@@ -61,7 +61,7 @@ func (s {{.StructName}}) Subtract(others ...{{.StructName}}) {{.StructName}} {
}
func (s {{.StructName}}) Any() {{.ElemName}} {
return {{.ElemName}}FromVal(s.s.Any())
return {{fromVal .ElemName}}(s.s.Any())
}
func (s {{.StructName}}) fromStructSlice(p []{{.StructName}}) []types.Set {
@@ -75,7 +75,7 @@ func (s {{.StructName}}) fromStructSlice(p []{{.StructName}}) []types.Set {
func (s {{.StructName}}) fromElemSlice(p []{{.ElemName}}) []types.Value {
r := make([]types.Value, len(p))
for i, v := range p {
r[i] = v.NomsValue()
r[i] = v{{toVal .ElemName}}
}
return r
}

View File

@@ -24,3 +24,4 @@ func (s {{.StructName}}) Equals(p {{.StructName}}) bool {
func (s {{.StructName}}) Ref() ref.Ref {
return s.m.Ref()
}

View File

@@ -35,3 +35,7 @@ func (fb Blob) Equals(other Value) bool {
func NewBlob(data []byte) Blob {
return Blob{data, &ref.Ref{}}
}
func BlobFromVal(v Value) Blob {
return v.(Blob)
}

View File

@@ -12,3 +12,7 @@ func (v {{.NomsType}}) Ref() ref.Ref {
return getRef(v)
}
func {{.NomsType}}FromVal(v Value) {{.NomsType}} {
return v.({{.NomsType}})
}

View File

@@ -84,3 +84,7 @@ func (l List) Equals(other Value) bool {
return l.Ref() == other.Ref()
}
}
func ListFromVal(v Value) List {
return v.(List)
}

View File

@@ -60,7 +60,7 @@ func (fm Map) Remove(k Value) Map {
return fm
}
m := make(mapData, len(fm.m) - 1)
m := make(mapData, len(fm.m)-1)
copy(m, fm.m[:idx])
copy(m[idx:], fm.m[idx+1:])
return newMapFromData(m, fm.cs)
@@ -131,3 +131,7 @@ func indexMapData(m mapData, r ref.Ref) int {
return !ref.Less(m[i].key.Ref(), r)
})
}
func MapFromVal(v Value) Map {
return v.(Map)
}

View File

@@ -21,6 +21,10 @@ func (v Bool) Ref() ref.Ref {
return getRef(v)
}
func BoolFromVal(v Value) Bool {
return v.(Bool)
}
type Int16 int16
func (self Int16) Equals(other Value) bool {
@@ -35,6 +39,10 @@ func (v Int16) Ref() ref.Ref {
return getRef(v)
}
func Int16FromVal(v Value) Int16 {
return v.(Int16)
}
type Int32 int32
func (self Int32) Equals(other Value) bool {
@@ -49,6 +57,10 @@ func (v Int32) Ref() ref.Ref {
return getRef(v)
}
func Int32FromVal(v Value) Int32 {
return v.(Int32)
}
type Int64 int64
func (self Int64) Equals(other Value) bool {
@@ -63,6 +75,10 @@ func (v Int64) Ref() ref.Ref {
return getRef(v)
}
func Int64FromVal(v Value) Int64 {
return v.(Int64)
}
type UInt16 uint16
func (self UInt16) Equals(other Value) bool {
@@ -77,6 +93,10 @@ func (v UInt16) Ref() ref.Ref {
return getRef(v)
}
func UInt16FromVal(v Value) UInt16 {
return v.(UInt16)
}
type UInt32 uint32
func (self UInt32) Equals(other Value) bool {
@@ -91,6 +111,10 @@ func (v UInt32) Ref() ref.Ref {
return getRef(v)
}
func UInt32FromVal(v Value) UInt32 {
return v.(UInt32)
}
type UInt64 uint64
func (self UInt64) Equals(other Value) bool {
@@ -105,6 +129,10 @@ func (v UInt64) Ref() ref.Ref {
return getRef(v)
}
func UInt64FromVal(v Value) UInt64 {
return v.(UInt64)
}
type Float32 float32
func (self Float32) Equals(other Value) bool {
@@ -119,6 +147,10 @@ func (v Float32) Ref() ref.Ref {
return getRef(v)
}
func Float32FromVal(v Value) Float32 {
return v.(Float32)
}
type Float64 float64
func (self Float64) Equals(other Value) bool {
@@ -133,3 +165,7 @@ func (v Float64) Ref() ref.Ref {
return getRef(v)
}
func Float64FromVal(v Value) Float64 {
return v.(Float64)
}

View File

@@ -142,3 +142,7 @@ func indexSetData(m setData, r ref.Ref) int {
return !ref.Less(m[i].Ref(), r)
})
}
func SetFromVal(v Value) Set {
return v.(Set)
}

View File

@@ -32,3 +32,7 @@ func (fs String) Equals(other Value) bool {
return fs.Ref() == other.Ref()
}
}
func StringFromVal(v Value) String {
return v.(String)
}