uamqp_generator/Program.cs (178 lines of code) (raw):
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Serialization;
namespace amqplib_generator
{
class Program
{
private static type _currentTypeObject;
public static type CurrentTypeObject
{
get { return _currentTypeObject; }
}
private static List<type> types;
public static amqp LoadAMQPTypes()
{
XmlSerializer serializer = new XmlSerializer(typeof(amqp));
StreamReader reader = new StreamReader("../../amqp_definitions.xml");
amqp amqp = (amqp)serializer.Deserialize(reader);
reader.Close();
return amqp;
}
public static string GetCType(string amqp_type, bool multiple)
{
string result;
if (multiple)
{
result = "AMQP_VALUE";
}
else
{
switch (amqp_type)
{
default:
result = amqp_type.ToLower().Replace('-', '_').Replace(':', '_');
break;
case "binary":
result = "amqp_binary";
break;
case "boolean":
result = "bool";
break;
case "uint":
result = "uint32_t";
break;
case "ubyte":
result = "uint8_t";
break;
case "ushort":
result = "uint16_t";
break;
case "ulong":
result = "uint64_t";
break;
case "string":
result = "const char*";
break;
case "symbol":
result = "const char*";
break;
case "map":
result = "AMQP_VALUE";
break;
case "list":
result = "AMQP_VALUE";
break;
case "*":
result = "AMQP_VALUE";
break;
}
}
return result;
}
public static type GetTypeByName(string type_name)
{
type result;
IEnumerable<type> result_query = types.Where(t => t.name == type_name);
if (result_query.Count() != 1)
{
result = null;
}
else
{
result = result_query.First();
}
return result;
}
public static descriptor GetDescriptor(type type)
{
descriptor result;
IEnumerable<descriptor> result_query = type.Items.Where(t => t is descriptor).Cast<descriptor>();
if (result_query.Count() != 1)
{
result = null;
}
else
{
result = result_query.First();
}
return result;
}
public static UInt64 GetDescriptorCode(descriptor descriptor)
{
UInt64 result;
string[] strings = descriptor.code.Split(new char[] { ':' });
result = (Convert.ToUInt64(strings[0], 16) << 32) + Convert.ToUInt64(strings[1], 16);
return result;
}
public static string GetMandatoryArgList(type type)
{
string result = string.Empty;
foreach(field field in type.Items.Where(item => (item is field) && ((item as field).mandatory == "true")))
{
if (result.Length > 0)
{
result += ", ";
}
result += GetCType(field.type, field.multiple == "true").Replace('-', '_').Replace(':', '_') + " " + field.name.Replace('-', '_').Replace(':', '_') + "_value";
}
if (string.IsNullOrEmpty(result))
{
result = "void";
}
return result;
}
public static string GetMandatoryArgListMock(type type)
{
string result = string.Empty;
foreach (field field in type.Items.Where(item => (item is field) && ((item as field).mandatory == "true")))
{
result += ", ";
result += GetCType(field.type, field.multiple == "true").Replace('-', '_').Replace(':', '_') + ", " + field.name.Replace('-', '_').Replace(':', '_') + "_value";
}
return result;
}
public static ICollection<KeyValuePair<field, int>> GetMandatoryArgs(type type)
{
List<KeyValuePair<field, int>> mandatory_args = new List<KeyValuePair<field, int>>();
int fieldCount = 0;
for (int i = 0; i < type.Items.Length; i++)
{
if (type.Items[i] is field)
{
if ((type.Items[i] as field).mandatory == "true")
{
mandatory_args.Add(new KeyValuePair<field, int>(type.Items[i] as field, fieldCount));
}
fieldCount++;
}
}
return mandatory_args;
}
static void Main(string[] args)
{
amqp amqp = LoadAMQPTypes();
foreach (section section in amqp.Items.Where(item => item is section))
{
types = new List<type>();
types.AddRange(section.Items.Where(item => item is type).Cast<type>());
foreach (type type in types)
{
amqp_definitions_type_h amqp_definitions_type_h = new amqp_definitions_type_h();
_currentTypeObject = type;
System.IO.File.WriteAllText($"../../../inc/azure_uamqp_c/amqp_definitions_{type.name.Replace("-","_")}.h", amqp_definitions_type_h.TransformText());
}
}
amqp_definitions_h amqp_definitions_h = new amqp_definitions_h();
System.IO.File.WriteAllText("../../../inc/azure_uamqp_c/amqp_definitions.h", amqp_definitions_h.TransformText());
amqp_definitions_c amqp_definitions_c = new amqp_definitions_c();
System.IO.File.WriteAllText("../../../src/amqp_definitions.c", amqp_definitions_c.TransformText());
}
}
}