From 5b3f6111049870ae8bdf13dad7639a91df059731 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Fri, 25 Sep 2015 14:14:30 -0400 Subject: [PATCH] NomDL Codegen: Add optional flag to Field --- clients/pitchmap/index/types.go | 4 +- clients/tagdex/types.go | 61 +++++++++++++++++++ datas/types.go | 4 +- dataset/mgmt/types.go | 4 +- nomdl/codegen/codegen.go | 2 +- nomdl/codegen/struct.tmpl | 4 +- nomdl/codegen/test/enum_struct.go | 2 +- nomdl/codegen/test/ref.go | 2 +- nomdl/codegen/test/struct.go | 4 +- nomdl/codegen/test/struct_primitives.go | 28 ++++----- nomdl/codegen/test/struct_recursive.go | 2 +- nomdl/codegen/test/struct_with_list.go | 8 +-- nomdl/codegen/test/struct_with_union_field.go | 12 ++-- nomdl/codegen/test/struct_with_unions.go | 16 ++--- types/package.go | 4 +- types/type_ref.go | 5 +- types/type_ref_test.go | 8 +-- 17 files changed, 116 insertions(+), 54 deletions(-) diff --git a/clients/pitchmap/index/types.go b/clients/pitchmap/index/types.go index 768e29a412..f5ef9e64b1 100644 --- a/clients/pitchmap/index/types.go +++ b/clients/pitchmap/index/types.go @@ -497,8 +497,8 @@ func (self Pitch) Def() PitchDef { func __typeRefOfPitch() types.TypeRef { return types.MakeStructTypeRef("Pitch", []types.Field{ - types.Field{"X", types.MakePrimitiveTypeRef(types.Float64Kind)}, - types.Field{"Z", types.MakePrimitiveTypeRef(types.Float64Kind)}, + types.Field{"X", types.MakePrimitiveTypeRef(types.Float64Kind), false}, + types.Field{"Z", types.MakePrimitiveTypeRef(types.Float64Kind), false}, }, nil) diff --git a/clients/tagdex/types.go b/clients/tagdex/types.go index 0c31df85dc..550d1c24ae 100644 --- a/clients/tagdex/types.go +++ b/clients/tagdex/types.go @@ -69,6 +69,14 @@ func (s RemotePhoto) SetTags(p SetOfString) RemotePhoto { return RemotePhotoFromVal(s.m.Set(types.NewString("tags"), p.NomsValue())) } +func (s RemotePhoto) Geoposition() Geoposition { + return GeopositionFromVal(s.m.Get(types.NewString("geoposition"))) +} + +func (s RemotePhoto) SetGeoposition(p Geoposition) RemotePhoto { + return RemotePhotoFromVal(s.m.Set(types.NewString("geoposition"), p.NomsValue())) +} + func (s RemotePhoto) Url() types.String { return types.StringFromVal(s.m.Get(types.NewString("url"))) } @@ -228,6 +236,14 @@ func (s Photo) SetHeight(p types.UInt32) Photo { return PhotoFromVal(s.m.Set(types.NewString("height"), p)) } +func (s Photo) Geoposition() Geoposition { + return GeopositionFromVal(s.m.Get(types.NewString("geoposition"))) +} + +func (s Photo) SetGeoposition(p Geoposition) Photo { + return PhotoFromVal(s.m.Set(types.NewString("geoposition"), p.NomsValue())) +} + func (s Photo) Image() types.Blob { return types.BlobFromVal(s.m.Get(types.NewString("image"))) } @@ -244,6 +260,51 @@ func (s Photo) SetUrl(p types.String) Photo { return PhotoFromVal(s.m.Set(types.NewString("url"), p)) } +// Geoposition + +type Geoposition struct { + m types.Map +} + +func NewGeoposition() Geoposition { + return Geoposition{ + types.NewMap(types.NewString("$name"), types.NewString("Geoposition")), + } +} + +func GeopositionFromVal(v types.Value) Geoposition { + return Geoposition{v.(types.Map)} +} + +// TODO: This was going to be called Value() but it collides with root.value. We need some other place to put the built-in fields like Value() and Equals(). +func (s Geoposition) NomsValue() types.Map { + return s.m +} + +func (s Geoposition) Equals(p Geoposition) bool { + return s.m.Equals(p.m) +} + +func (s Geoposition) Ref() ref.Ref { + return s.m.Ref() +} + +func (s Geoposition) Longitude() types.Float32 { + return types.Float32FromVal(s.m.Get(types.NewString("longitude"))) +} + +func (s Geoposition) SetLongitude(p types.Float32) Geoposition { + return GeopositionFromVal(s.m.Set(types.NewString("longitude"), p)) +} + +func (s Geoposition) Latitude() types.Float32 { + return types.Float32FromVal(s.m.Get(types.NewString("latitude"))) +} + +func (s Geoposition) SetLatitude(p types.Float32) Geoposition { + return GeopositionFromVal(s.m.Set(types.NewString("latitude"), p)) +} + // MapOfSizeToString type MapOfSizeToString struct { diff --git a/datas/types.go b/datas/types.go index cd94a3b355..7a49239d9b 100644 --- a/datas/types.go +++ b/datas/types.go @@ -41,8 +41,8 @@ func NewCommit() Commit { func __typeRefOfCommit() types.TypeRef { return types.MakeStructTypeRef("Commit", []types.Field{ - types.Field{"value", types.MakePrimitiveTypeRef(types.ValueKind)}, - types.Field{"parents", types.MakeCompoundTypeRef("", types.SetKind, types.MakeTypeRef("Commit", types.Ref{}))}, + types.Field{"value", types.MakePrimitiveTypeRef(types.ValueKind), false}, + types.Field{"parents", types.MakeCompoundTypeRef("", types.SetKind, types.MakeTypeRef("Commit", types.Ref{})), false}, }, nil) diff --git a/dataset/mgmt/types.go b/dataset/mgmt/types.go index 5a67551ee1..134ac01eb1 100644 --- a/dataset/mgmt/types.go +++ b/dataset/mgmt/types.go @@ -186,8 +186,8 @@ func (self Dataset) Def() DatasetDef { func __typeRefOfDataset() types.TypeRef { return types.MakeStructTypeRef("Dataset", []types.Field{ - types.Field{"id", types.MakePrimitiveTypeRef(types.StringKind)}, - types.Field{"head", types.MakePrimitiveTypeRef(types.ValueKind)}, + types.Field{"id", types.MakePrimitiveTypeRef(types.StringKind), false}, + types.Field{"head", types.MakePrimitiveTypeRef(types.ValueKind), false}, }, nil) diff --git a/nomdl/codegen/codegen.go b/nomdl/codegen/codegen.go index 5f9b4ec722..a4c95c2645 100644 --- a/nomdl/codegen/codegen.go +++ b/nomdl/codegen/codegen.go @@ -438,7 +438,7 @@ func (gen *codeGen) toTypesTypeRef(t parse.TypeRef) string { flatten := func(f []parse.Field) string { out := make([]string, 0, len(f)) for _, field := range f { - out = append(out, fmt.Sprintf(`types.Field{"%s", %s},`, field.Name, gen.toTypesTypeRef(field.T))) + out = append(out, fmt.Sprintf(`types.Field{"%s", %s, %t},`, field.Name, gen.toTypesTypeRef(field.T), field.Optional)) } return strings.Join(out, "\n") } diff --git a/nomdl/codegen/struct.tmpl b/nomdl/codegen/struct.tmpl index 71a2e83d98..06a62deeb4 100644 --- a/nomdl/codegen/struct.tmpl +++ b/nomdl/codegen/struct.tmpl @@ -64,11 +64,11 @@ func New{{.Name}}() {{.Name}} { func __typeRefOf{{.Name}}() types.TypeRef { return types.MakeStructTypeRef("{{.Name}}", []types.Field{ - {{range .Fields}}types.Field{"{{.Name}}", {{toTypesTypeRef .T}}}, + {{range .Fields}}types.Field{"{{.Name}}", {{toTypesTypeRef .T}}, {{.Optional}}}, {{end}} }, {{if .HasUnion}}[]types.Field{ - {{range .Choices}}types.Field{"{{.Name}}", {{toTypesTypeRef .T}}}, + {{range .Choices}}types.Field{"{{.Name}}", {{toTypesTypeRef .T}}, {{.Optional}}}, {{end}} }{{else}}nil{{end}}) diff --git a/nomdl/codegen/test/enum_struct.go b/nomdl/codegen/test/enum_struct.go index f3704b3291..4cbb257fb5 100644 --- a/nomdl/codegen/test/enum_struct.go +++ b/nomdl/codegen/test/enum_struct.go @@ -60,7 +60,7 @@ func (self EnumStruct) Def() EnumStructDef { func __typeRefOfEnumStruct() types.TypeRef { return types.MakeStructTypeRef("EnumStruct", []types.Field{ - types.Field{"hand", types.MakeTypeRef("Handedness", types.Ref{})}, + types.Field{"hand", types.MakeTypeRef("Handedness", types.Ref{}), false}, }, nil) diff --git a/nomdl/codegen/test/ref.go b/nomdl/codegen/test/ref.go index 622e505810..5c1b73bc79 100644 --- a/nomdl/codegen/test/ref.go +++ b/nomdl/codegen/test/ref.go @@ -364,7 +364,7 @@ func (self StructWithRef) Def() StructWithRefDef { func __typeRefOfStructWithRef() types.TypeRef { return types.MakeStructTypeRef("StructWithRef", []types.Field{ - types.Field{"r", types.MakeCompoundTypeRef("", types.RefKind, types.MakeCompoundTypeRef("", types.SetKind, types.MakePrimitiveTypeRef(types.Float32Kind)))}, + types.Field{"r", types.MakeCompoundTypeRef("", types.RefKind, types.MakeCompoundTypeRef("", types.SetKind, types.MakePrimitiveTypeRef(types.Float32Kind))), false}, }, nil) diff --git a/nomdl/codegen/test/struct.go b/nomdl/codegen/test/struct.go index 12a6455d14..77d4548e26 100644 --- a/nomdl/codegen/test/struct.go +++ b/nomdl/codegen/test/struct.go @@ -63,8 +63,8 @@ func (self Struct) Def() StructDef { func __typeRefOfStruct() types.TypeRef { return types.MakeStructTypeRef("Struct", []types.Field{ - types.Field{"s", types.MakePrimitiveTypeRef(types.StringKind)}, - types.Field{"b", types.MakePrimitiveTypeRef(types.BoolKind)}, + types.Field{"s", types.MakePrimitiveTypeRef(types.StringKind), false}, + types.Field{"b", types.MakePrimitiveTypeRef(types.BoolKind), false}, }, nil) diff --git a/nomdl/codegen/test/struct_primitives.go b/nomdl/codegen/test/struct_primitives.go index ca40baad25..8d14c6f144 100644 --- a/nomdl/codegen/test/struct_primitives.go +++ b/nomdl/codegen/test/struct_primitives.go @@ -111,20 +111,20 @@ func (self StructPrimitives) Def() StructPrimitivesDef { func __typeRefOfStructPrimitives() types.TypeRef { return types.MakeStructTypeRef("StructPrimitives", []types.Field{ - types.Field{"uint64", types.MakePrimitiveTypeRef(types.UInt64Kind)}, - types.Field{"uint32", types.MakePrimitiveTypeRef(types.UInt32Kind)}, - types.Field{"uint16", types.MakePrimitiveTypeRef(types.UInt16Kind)}, - types.Field{"uint8", types.MakePrimitiveTypeRef(types.UInt8Kind)}, - types.Field{"int64", types.MakePrimitiveTypeRef(types.Int64Kind)}, - types.Field{"int32", types.MakePrimitiveTypeRef(types.Int32Kind)}, - types.Field{"int16", types.MakePrimitiveTypeRef(types.Int16Kind)}, - types.Field{"int8", types.MakePrimitiveTypeRef(types.Int8Kind)}, - types.Field{"float64", types.MakePrimitiveTypeRef(types.Float64Kind)}, - types.Field{"float32", types.MakePrimitiveTypeRef(types.Float32Kind)}, - types.Field{"bool", types.MakePrimitiveTypeRef(types.BoolKind)}, - types.Field{"string", types.MakePrimitiveTypeRef(types.StringKind)}, - types.Field{"blob", types.MakePrimitiveTypeRef(types.BlobKind)}, - types.Field{"value", types.MakePrimitiveTypeRef(types.ValueKind)}, + types.Field{"uint64", types.MakePrimitiveTypeRef(types.UInt64Kind), false}, + types.Field{"uint32", types.MakePrimitiveTypeRef(types.UInt32Kind), false}, + types.Field{"uint16", types.MakePrimitiveTypeRef(types.UInt16Kind), false}, + types.Field{"uint8", types.MakePrimitiveTypeRef(types.UInt8Kind), false}, + types.Field{"int64", types.MakePrimitiveTypeRef(types.Int64Kind), false}, + types.Field{"int32", types.MakePrimitiveTypeRef(types.Int32Kind), false}, + types.Field{"int16", types.MakePrimitiveTypeRef(types.Int16Kind), false}, + types.Field{"int8", types.MakePrimitiveTypeRef(types.Int8Kind), false}, + types.Field{"float64", types.MakePrimitiveTypeRef(types.Float64Kind), false}, + types.Field{"float32", types.MakePrimitiveTypeRef(types.Float32Kind), false}, + types.Field{"bool", types.MakePrimitiveTypeRef(types.BoolKind), false}, + types.Field{"string", types.MakePrimitiveTypeRef(types.StringKind), false}, + types.Field{"blob", types.MakePrimitiveTypeRef(types.BlobKind), false}, + types.Field{"value", types.MakePrimitiveTypeRef(types.ValueKind), false}, }, nil) diff --git a/nomdl/codegen/test/struct_recursive.go b/nomdl/codegen/test/struct_recursive.go index a6fecb39f5..694556504a 100644 --- a/nomdl/codegen/test/struct_recursive.go +++ b/nomdl/codegen/test/struct_recursive.go @@ -59,7 +59,7 @@ func (self Tree) Def() TreeDef { func __typeRefOfTree() types.TypeRef { return types.MakeStructTypeRef("Tree", []types.Field{ - types.Field{"children", types.MakeCompoundTypeRef("", types.ListKind, types.MakeTypeRef("Tree", types.Ref{}))}, + types.Field{"children", types.MakeCompoundTypeRef("", types.ListKind, types.MakeTypeRef("Tree", types.Ref{})), false}, }, nil) diff --git a/nomdl/codegen/test/struct_with_list.go b/nomdl/codegen/test/struct_with_list.go index e36056e6b8..324a7da148 100644 --- a/nomdl/codegen/test/struct_with_list.go +++ b/nomdl/codegen/test/struct_with_list.go @@ -71,10 +71,10 @@ func (self StructWithList) Def() StructWithListDef { func __typeRefOfStructWithList() types.TypeRef { return types.MakeStructTypeRef("StructWithList", []types.Field{ - types.Field{"l", types.MakeCompoundTypeRef("", types.ListKind, types.MakePrimitiveTypeRef(types.UInt8Kind))}, - types.Field{"b", types.MakePrimitiveTypeRef(types.BoolKind)}, - types.Field{"s", types.MakePrimitiveTypeRef(types.StringKind)}, - types.Field{"i", types.MakePrimitiveTypeRef(types.Int64Kind)}, + types.Field{"l", types.MakeCompoundTypeRef("", types.ListKind, types.MakePrimitiveTypeRef(types.UInt8Kind)), false}, + types.Field{"b", types.MakePrimitiveTypeRef(types.BoolKind), false}, + types.Field{"s", types.MakePrimitiveTypeRef(types.StringKind), false}, + types.Field{"i", types.MakePrimitiveTypeRef(types.Int64Kind), false}, }, nil) diff --git a/nomdl/codegen/test/struct_with_union_field.go b/nomdl/codegen/test/struct_with_union_field.go index 8c03469753..432e27c5ac 100644 --- a/nomdl/codegen/test/struct_with_union_field.go +++ b/nomdl/codegen/test/struct_with_union_field.go @@ -99,14 +99,14 @@ func (self StructWithUnionField) __unionValueToDef() interface{} { func __typeRefOfStructWithUnionField() types.TypeRef { return types.MakeStructTypeRef("StructWithUnionField", []types.Field{ - types.Field{"a", types.MakePrimitiveTypeRef(types.Float32Kind)}, + types.Field{"a", types.MakePrimitiveTypeRef(types.Float32Kind), false}, }, []types.Field{ - types.Field{"b", types.MakePrimitiveTypeRef(types.Float64Kind)}, - types.Field{"c", types.MakePrimitiveTypeRef(types.StringKind)}, - types.Field{"d", types.MakePrimitiveTypeRef(types.BlobKind)}, - types.Field{"e", types.MakePrimitiveTypeRef(types.ValueKind)}, - types.Field{"f", types.MakeCompoundTypeRef("", types.SetKind, types.MakePrimitiveTypeRef(types.UInt8Kind))}, + types.Field{"b", types.MakePrimitiveTypeRef(types.Float64Kind), false}, + types.Field{"c", types.MakePrimitiveTypeRef(types.StringKind), false}, + types.Field{"d", types.MakePrimitiveTypeRef(types.BlobKind), false}, + types.Field{"e", types.MakePrimitiveTypeRef(types.ValueKind), false}, + types.Field{"f", types.MakeCompoundTypeRef("", types.SetKind, types.MakePrimitiveTypeRef(types.UInt8Kind)), false}, }) } diff --git a/nomdl/codegen/test/struct_with_unions.go b/nomdl/codegen/test/struct_with_unions.go index 625dd3037a..e08797f917 100644 --- a/nomdl/codegen/test/struct_with_unions.go +++ b/nomdl/codegen/test/struct_with_unions.go @@ -63,10 +63,10 @@ func (self StructWithUnions) Def() StructWithUnionsDef { func __typeRefOfStructWithUnions() types.TypeRef { return types.MakeStructTypeRef("StructWithUnions", []types.Field{ - types.Field{"a", types.MakeStructTypeRef("", nil, []types.Field{types.Field{"b", types.MakePrimitiveTypeRef(types.Float64Kind)}, - types.Field{"c", types.MakePrimitiveTypeRef(types.StringKind)}})}, - types.Field{"d", types.MakeStructTypeRef("", nil, []types.Field{types.Field{"e", types.MakePrimitiveTypeRef(types.Float64Kind)}, - types.Field{"f", types.MakePrimitiveTypeRef(types.StringKind)}})}, + types.Field{"a", types.MakeStructTypeRef("", nil, []types.Field{types.Field{"b", types.MakePrimitiveTypeRef(types.Float64Kind), false}, + types.Field{"c", types.MakePrimitiveTypeRef(types.StringKind), false}}), false}, + types.Field{"d", types.MakeStructTypeRef("", nil, []types.Field{types.Field{"e", types.MakePrimitiveTypeRef(types.Float64Kind), false}, + types.Field{"f", types.MakePrimitiveTypeRef(types.StringKind), false}}), false}, }, nil) @@ -171,8 +171,8 @@ func __typeRefOf__unionOfBOfFloat64AndCOfString() types.TypeRef { return types.MakeStructTypeRef("__unionOfBOfFloat64AndCOfString", []types.Field{}, []types.Field{ - types.Field{"b", types.MakePrimitiveTypeRef(types.Float64Kind)}, - types.Field{"c", types.MakePrimitiveTypeRef(types.StringKind)}, + types.Field{"b", types.MakePrimitiveTypeRef(types.Float64Kind), false}, + types.Field{"c", types.MakePrimitiveTypeRef(types.StringKind), false}, }) } @@ -308,8 +308,8 @@ func __typeRefOf__unionOfEOfFloat64AndFOfString() types.TypeRef { return types.MakeStructTypeRef("__unionOfEOfFloat64AndFOfString", []types.Field{}, []types.Field{ - types.Field{"e", types.MakePrimitiveTypeRef(types.Float64Kind)}, - types.Field{"f", types.MakePrimitiveTypeRef(types.StringKind)}, + types.Field{"e", types.MakePrimitiveTypeRef(types.Float64Kind), false}, + types.Field{"f", types.MakePrimitiveTypeRef(types.StringKind), false}, }) } diff --git a/types/package.go b/types/package.go index c4faaac43b..3e4bddb27a 100644 --- a/types/package.go +++ b/types/package.go @@ -48,8 +48,8 @@ func (self Package) Def() PackageDef { func __typeRefOfPackage() TypeRef { return MakeStructTypeRef("Package", []Field{ - Field{"Dependencies", MakeCompoundTypeRef("", SetKind, MakeCompoundTypeRef("", RefKind, MakeTypeRef("Package", Ref{})))}, - Field{"Types", MakeCompoundTypeRef("", MapKind, MakePrimitiveTypeRef(StringKind), MakePrimitiveTypeRef(TypeRefKind))}, + Field{"Dependencies", MakeCompoundTypeRef("", SetKind, MakeCompoundTypeRef("", RefKind, MakeTypeRef("Package", Ref{}))), false}, + Field{"Types", MakeCompoundTypeRef("", MapKind, MakePrimitiveTypeRef(StringKind), MakePrimitiveTypeRef(TypeRefKind)), false}, }, nil) diff --git a/types/type_ref.go b/types/type_ref.go index cba42f9fa3..104684a8c9 100644 --- a/types/type_ref.go +++ b/types/type_ref.go @@ -169,8 +169,9 @@ func MakeStructTypeRef(name string, fields, choices []Field) TypeRef { // Field represents a Struct field or a Union choice. // Neither Name nor T is allowed to be a zero-value, though T may be an unresolved TypeRef. type Field struct { - Name string - T TypeRef + Name string + T TypeRef + Optional bool } func MakeTypeRef(name string, pkg Ref) TypeRef { diff --git a/types/type_ref_test.go b/types/type_ref_test.go index c06c8b474c..3e31785b64 100644 --- a/types/type_ref_test.go +++ b/types/type_ref_test.go @@ -17,12 +17,12 @@ func TestTypes(t *testing.T) { mapType := MakeCompoundTypeRef("MapOfStringToUInt8", MapKind, stringType, uint8Type) setType := MakeCompoundTypeRef("SetOfString", SetKind, stringType) mahType := MakeStructTypeRef("MahStruct", []Field{ - Field{"Field1", stringType}, - Field{"Field2", boolType}, + Field{"Field1", stringType, false}, + Field{"Field2", boolType, false}, }, nil) otherType := MakeStructTypeRef("MahOtherStruct", nil, []Field{ - Field{"StructField", mahType}, - Field{"StringField", stringType}, + Field{"StructField", mahType, false}, + Field{"StringField", stringType, false}, }) mRef := WriteValue(mapType, cs)