blob: 666d10d236f68f6250d46c0315c773fb4779d78a [file] [log] [blame]
// 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.
/**
* @fileoverview Utility for converting from a kind to a TypeObject.
* @private
*/
var kind = require('./kind.js');
var Type = require('./type.js');
var types = require('./types.js');
module.exports = typeObjectFromKind;
// All Types below are constructed with 'isValidated' set to true. This avoids a
// cyclic dependency with canonicalize.js and type.js.
var _primitiveTypeObject = new Type({
name: 'PrimitiveTypeObject',
kind: kind.STRUCT,
fields: [
{
name: 'Kind',
type: types.STRING
},
{
name: 'Name',
type: types.STRING
}
]
}, true);
var _optionalTypeObject = new Type({
name: 'OptionalTypeObject',
kind: kind.STRUCT,
fields: [
{
name: 'Kind',
type: types.STRING
},
{
name: 'Name',
type: types.STRING
},
{
name: 'Elem',
type: types.TYPEOBJECT
}
]
}, true);
var _enumTypeObject = new Type({
name: 'EnumTypeObject',
kind: kind.STRUCT,
fields: [
{
name: 'Kind',
type: types.STRING
},
{
name: 'Name',
type: types.STRING
},
{
name: 'Labels',
type: new Type({
kind: kind.LIST,
elem: types.STRING
}, true)
}
]
}, true);
var _listTypeObject = new Type({
name: 'ListTypeObject',
kind: kind.STRUCT,
fields: [
{
name: 'Kind',
type: types.STRING
},
{
name: 'Name',
type: types.STRING
},
{
name: 'Elem',
type: types.TYPEOBJECT
}
]
}, true);
var _arrayTypeObject = new Type({
name: 'ArrayTypeObject',
kind: kind.STRUCT,
fields: [
{
name: 'Kind',
type: types.STRING
},
{
name: 'Name',
type: types.STRING
},
{
name: 'Elem',
type: types.TYPEOBJECT
},
{
name: 'Len',
type: types.UINT32
}
]
}, true);
var _setTypeObject = new Type({
name: 'SetTypeObject',
kind: kind.STRUCT,
fields: [
{
name: 'Kind',
type: types.STRING
},
{
name: 'Name',
type: types.STRING
},
{
name: 'Key',
type: types.TYPEOBJECT
}
]
}, true);
var _mapTypeObject = new Type({
name: 'MapTypeObject',
kind: kind.STRUCT,
fields: [
{
name: 'Kind',
type: types.STRING
},
{
name: 'Name',
type: types.STRING
},
{
name: 'Key',
type: types.TYPEOBJECT
},
{
name: 'Elem',
type: types.TYPEOBJECT
}
]
}, true);
var _structTypeObject = new Type({
name: 'StructTypeObject',
kind: kind.STRUCT,
fields: [
{
name: 'Kind',
type: types.STRING
},
{
name: 'Name',
type: types.STRING
},
{
name: 'Fields',
type: new Type({
kind: kind.LIST,
elem: new Type({
kind: kind.STRUCT,
fields: [
{
name: 'Name',
type: types.STRING
},
{
name: 'Type',
type: types.TYPEOBJECT
}
]
}, true)
}, true)
}
]
}, true);
var _unionTypeObject = new Type({
name: 'UnionTypeObject',
kind: kind.STRUCT,
fields: [
{
name: 'Kind',
type: types.STRING
},
{
name: 'Name',
type: types.STRING
},
{
name: 'Fields',
type: new Type({
kind: kind.LIST,
elem: new Type({
kind: kind.STRUCT,
fields: [
{
name: 'Name',
type: types.STRING
},
{
name: 'Type',
type: types.TYPEOBJECT
}
]
}, true)
}, true)
}
]
}, true);
/**
* Returns the corresponding type object for a given kind.
* @private
* @param {kind} k The kind.
* @return {TypeObject} The corresponding type object.
*/
function typeObjectFromKind(k) {
switch (k) {
case kind.BOOL:
case kind.BYTE:
case kind.UINT16:
case kind.UINT32:
case kind.UINT64:
case kind.INT8:
case kind.INT16:
case kind.INT32:
case kind.INT64:
case kind.FLOAT32:
case kind.FLOAT64:
case kind.COMPLEX64:
case kind.COMPLEX128:
case kind.STRING:
case kind.ANY:
case kind.TYPEOBJECT:
return _primitiveTypeObject;
case kind.OPTIONAL:
return _optionalTypeObject;
case kind.ENUM:
return _enumTypeObject;
case kind.LIST:
return _listTypeObject;
case kind.ARRAY:
return _arrayTypeObject;
case kind.SET:
return _setTypeObject;
case kind.MAP:
return _mapTypeObject;
case kind.STRUCT:
return _structTypeObject;
case kind.UNION:
return _unionTypeObject;
default:
throw new TypeError('Unknown kind ' + k);
}
}