// 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.

// This file was auto-generated by the vanadium vdl tool.
var vdl = require('../../../../../vdl');
var canonicalize = require('../../../../../vdl/canonicalize');






module.exports = {};



// Types:
var _type1 = new vdl.Type();
var _type2 = new vdl.Type();
var _type3 = new vdl.Type();
var _type4 = new vdl.Type();
var _typeConfig = new vdl.Type();
var _typeGenLanguage = new vdl.Type();
var _typeGoConfig = new vdl.Type();
var _typeGoImport = new vdl.Type();
var _typeGoType = new vdl.Type();
var _typeJavaConfig = new vdl.Type();
var _typeJavascriptConfig = new vdl.Type();
_type1.kind = vdl.kind.SET;
_type1.name = "";
_type1.key = _typeGenLanguage;
_type2.kind = vdl.kind.MAP;
_type2.name = "";
_type2.elem = _typeGoType;
_type2.key = vdl.types.STRING;
_type3.kind = vdl.kind.LIST;
_type3.name = "";
_type3.elem = _typeGoImport;
_type4.kind = vdl.kind.MAP;
_type4.name = "";
_type4.elem = vdl.types.STRING;
_type4.key = vdl.types.STRING;
_typeConfig.kind = vdl.kind.STRUCT;
_typeConfig.name = "vdltool.Config";
_typeConfig.fields = [{name: "GenLanguages", type: _type1}, {name: "Go", type: _typeGoConfig}, {name: "Java", type: _typeJavaConfig}, {name: "Javascript", type: _typeJavascriptConfig}];
_typeGenLanguage.kind = vdl.kind.ENUM;
_typeGenLanguage.name = "vdltool.GenLanguage";
_typeGenLanguage.labels = ["Go", "Java", "Javascript"];
_typeGoConfig.kind = vdl.kind.STRUCT;
_typeGoConfig.name = "vdltool.GoConfig";
_typeGoConfig.fields = [{name: "WireToNativeTypes", type: _type2}];
_typeGoImport.kind = vdl.kind.STRUCT;
_typeGoImport.name = "vdltool.GoImport";
_typeGoImport.fields = [{name: "Path", type: vdl.types.STRING}, {name: "Name", type: vdl.types.STRING}];
_typeGoType.kind = vdl.kind.STRUCT;
_typeGoType.name = "vdltool.GoType";
_typeGoType.fields = [{name: "Type", type: vdl.types.STRING}, {name: "Imports", type: _type3}];
_typeJavaConfig.kind = vdl.kind.STRUCT;
_typeJavaConfig.name = "vdltool.JavaConfig";
_typeJavaConfig.fields = [{name: "WireToNativeTypes", type: _type4}];
_typeJavascriptConfig.kind = vdl.kind.STRUCT;
_typeJavascriptConfig.name = "vdltool.JavascriptConfig";
_typeJavascriptConfig.fields = [];
_type1.freeze();
_type2.freeze();
_type3.freeze();
_type4.freeze();
_typeConfig.freeze();
_typeGenLanguage.freeze();
_typeGoConfig.freeze();
_typeGoImport.freeze();
_typeGoType.freeze();
_typeJavaConfig.freeze();
_typeJavascriptConfig.freeze();
module.exports.Config = (vdl.registry.lookupOrCreateConstructor(_typeConfig));
module.exports.GenLanguage = {
  GO: canonicalize.reduce(new (vdl.registry.lookupOrCreateConstructor(_typeGenLanguage))('Go', true), _typeGenLanguage),
  JAVA: canonicalize.reduce(new (vdl.registry.lookupOrCreateConstructor(_typeGenLanguage))('Java', true), _typeGenLanguage),
  JAVASCRIPT: canonicalize.reduce(new (vdl.registry.lookupOrCreateConstructor(_typeGenLanguage))('Javascript', true), _typeGenLanguage),
};
module.exports.GoConfig = (vdl.registry.lookupOrCreateConstructor(_typeGoConfig));
module.exports.GoImport = (vdl.registry.lookupOrCreateConstructor(_typeGoImport));
module.exports.GoType = (vdl.registry.lookupOrCreateConstructor(_typeGoType));
module.exports.JavaConfig = (vdl.registry.lookupOrCreateConstructor(_typeJavaConfig));
module.exports.JavascriptConfig = (vdl.registry.lookupOrCreateConstructor(_typeJavascriptConfig));




// Consts:



// Errors:



// Services:

   
 


