| // Copyright 2015 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package vom |
| |
| // TODO(toddw): Add tests. |
| |
| import "v.io/v23/vdl" |
| |
| // TODO(toddw): Provide type management routines |
| |
| // Bootstrap mappings between type, id and kind. |
| var ( |
| bootstrapWireTypes map[*vdl.Type]struct{} |
| bootstrapIdToType map[typeId]*vdl.Type |
| bootstrapTypeToId map[*vdl.Type]typeId |
| bootstrapKindToId map[vdl.Kind]typeId |
| |
| typeIDType = vdl.TypeOf(typeId(0)) |
| wireTypeType = vdl.TypeOf((*wireType)(nil)) |
| wireNamedType = vdl.TypeOf(wireNamed{}) |
| wireEnumType = vdl.TypeOf(wireEnum{}) |
| wireArrayType = vdl.TypeOf(wireArray{}) |
| wireListType = vdl.TypeOf(wireList{}) |
| wireSetType = vdl.TypeOf(wireSet{}) |
| wireMapType = vdl.TypeOf(wireMap{}) |
| wireFieldType = vdl.TypeOf(wireField{}) |
| wireFieldListType = vdl.TypeOf([]wireField{}) |
| wireStructType = vdl.TypeOf(wireStruct{}) |
| wireUnionType = vdl.TypeOf(wireUnion{}) |
| wireOptionalType = vdl.TypeOf(wireOptional{}) |
| |
| wireByteListType = vdl.TypeOf([]byte{}) |
| wireStringListType = vdl.TypeOf([]string{}) |
| ) |
| |
| func init() { |
| bootstrapWireTypes = make(map[*vdl.Type]struct{}) |
| |
| // The basic wire types for type definition. |
| for _, tt := range []*vdl.Type{ |
| typeIDType, |
| wireTypeType, |
| wireFieldType, |
| wireFieldListType, |
| } { |
| bootstrapWireTypes[tt] = struct{}{} |
| } |
| |
| // The extra wire types for each kind of type definition. The field indices |
| // in wireType should not be changed. |
| wtTypes := []*vdl.Type{ |
| wireNamedType, |
| wireEnumType, |
| wireArrayType, |
| wireListType, |
| wireSetType, |
| wireMapType, |
| wireStructType, |
| wireUnionType, |
| wireOptionalType, |
| } |
| if len(wtTypes) != wireTypeType.NumField() { |
| panic("vom: wireType definition changed") |
| } |
| for ix, tt := range wtTypes { |
| if tt != wireTypeType.Field(ix).Type { |
| panic("vom: wireType definition changed") |
| } |
| bootstrapWireTypes[tt] = struct{}{} |
| } |
| |
| bootstrapIdToType = make(map[typeId]*vdl.Type) |
| bootstrapTypeToId = make(map[*vdl.Type]typeId) |
| bootstrapKindToId = make(map[vdl.Kind]typeId) |
| |
| // The basic bootstrap types can be converted between type, id and kind. |
| for id, tt := range map[typeId]*vdl.Type{ |
| WireIdBool: vdl.BoolType, |
| WireIdByte: vdl.ByteType, |
| WireIdString: vdl.StringType, |
| WireIdUint16: vdl.Uint16Type, |
| WireIdUint32: vdl.Uint32Type, |
| WireIdUint64: vdl.Uint64Type, |
| WireIdInt8: vdl.Int8Type, |
| WireIdInt16: vdl.Int16Type, |
| WireIdInt32: vdl.Int32Type, |
| WireIdInt64: vdl.Int64Type, |
| WireIdFloat32: vdl.Float32Type, |
| WireIdFloat64: vdl.Float64Type, |
| WireIdComplex64: vdl.Complex64Type, |
| WireIdComplex128: vdl.Complex128Type, |
| WireIdTypeObject: vdl.TypeObjectType, |
| WireIdAny: vdl.AnyType, |
| } { |
| bootstrapIdToType[id] = tt |
| bootstrapTypeToId[tt] = id |
| bootstrapKindToId[tt.Kind()] = id |
| } |
| // The extra bootstrap types can be converted between type and id. |
| for id, tt := range map[typeId]*vdl.Type{ |
| WireIdByteList: wireByteListType, |
| WireIdStringList: wireStringListType, |
| } { |
| bootstrapIdToType[id] = tt |
| bootstrapTypeToId[tt] = id |
| } |
| } |
| |
| // A generic interface for all wireType types. |
| type wireTypeGeneric interface { |
| TypeName() string |
| } |
| |
| func (wt wireTypeNamedT) TypeName() string { return wt.Value.Name } |
| func (wt wireTypeEnumT) TypeName() string { return wt.Value.Name } |
| func (wt wireTypeArrayT) TypeName() string { return wt.Value.Name } |
| func (wt wireTypeListT) TypeName() string { return wt.Value.Name } |
| func (wt wireTypeSetT) TypeName() string { return wt.Value.Name } |
| func (wt wireTypeMapT) TypeName() string { return wt.Value.Name } |
| func (wt wireTypeStructT) TypeName() string { return wt.Value.Name } |
| func (wt wireTypeUnionT) TypeName() string { return wt.Value.Name } |
| func (wt wireTypeOptionalT) TypeName() string { return wt.Value.Name } |