public static FieldName[] GetNameParts(string name, string propertyName) { if (string.IsNullOrEmpty(name)) { throw new ArgumentException("The value cannot be empty", "name"); } string originalName = name; // strip enclosing paranthesis if (name[0] == '(' && name[name.Length - 1] == ')') { name = name.Substring(1, name.Length - 2); throw new ArgumentException("This method does not support subfields: '" + name + "'"); } else { var parts = name.Split(new char[] { ':', '/', }, 2); if (parts.Length == 0) { return(null); } if (parts.Length == 1) { return(new FieldName[] { new FieldName { ApiName = name, PropertyName = propertyName ?? (propertyName = CSharpGenerator.Namify(name, NameTransformation.CamelCase)), ClassName = null, }, }); } var currentField = new FieldName { ApiName = parts[0], PropertyName = CSharpGenerator.Namify(parts[0], NameTransformation.CamelCase), }; currentField.ClassName = currentField.PropertyName; // handle subfields or sub-property names FieldName[] subFields = null; if (IsFieldList(parts[1])) { currentField.SubNames = GetFieldList(parts[1]); if (currentField.SubNames.Length == 1) { subFields = GetNameParts(currentField.SubNames[0], null); } } else { subFields = GetNameParts(parts[1], null); } // create result array FieldName[] result; if (subFields != null && subFields.Length > 0) { result = new FieldName[subFields.Length + 1]; Array.Copy(subFields, 0, result, 1, subFields.Length); } else { result = new FieldName[1]; } result[0] = currentField; return(result); } }
internal ReturnType FindReturnType(string name, string apiGroupName = null, string subPart = null, string typeName = null) { // find return type or null ReturnType returnItem = null; // handle different namespaces int dotPosition = name.LastIndexOf('.'); if (dotPosition > 0) { var ns = name.Substring(0, dotPosition); int dotPosition2 = ns.LastIndexOf('.'); if (dotPosition2 > 0) { ns = ns.Substring(0, dotPosition2); } if (apiGroupName != null) { apiGroupName = ns; } name = name.Substring(dotPosition + 1); } foreach (var group in this.Root.ApiGroups.Where(g => apiGroupName == null || g.Name == apiGroupName)) { if (returnItem != null) { break; } foreach (var item in group.ReturnTypes) { if (returnItem != null) { break; } if (item.Name == name || item.ClassName == name) { returnItem = item; } } } // create return type in specified API group if (apiGroupName != null && returnItem == null) { var item = new ReturnType { Name = name, ClassName = typeName ?? CSharpGenerator.Namify(name, NameTransformation.CamelCase), Fields = new List <Field>(), }; var group = this.Root.ApiGroups.Single(g => g.Name == apiGroupName); group.ReturnTypes.Add(item); returnItem = item; } if (returnItem != null) { if (subPart != null && subPart.First() == '(' && subPart.Last() == ')') { // subPart = "main:(sub)" // subPart = "main:(sub:(woot))" Field newField = null; { var parts = subPart.Substring(1, subPart.Length - 2).Split(new char[] { ':', }, 2); newField = new Field { Name = parts[0], ReturnType = name, Type = parts.Length > 1 && parts[1].Length > 2 ? CSharpGenerator.Namify(parts[0]) : null, }; returnItem.Fields.Add(newField); } { // split "main:(sub:(woot))" var parts = subPart.Substring(1, subPart.Length - 2).Split(new char[] { ':', '/', }, 2); var mainPart = parts.Length == 1 ? parts[0] : parts[0]; var subPart1 = parts.Length == 2 ? parts[1] : null; if (parts.Length > 1) { // "(sub:(woot))" var subReturnType = this.FindReturnType(mainPart, apiGroupName, subPart: subPart1); } } } else if (subPart != null) { // "main/sub" var parts = subPart.Split(new char[] { ':', '/', }, 2); returnItem.Fields.Add(new Field { Name = parts[0], ReturnType = name, }); } } return(returnItem); }
private static string GetGeneratedCodeFromXmlDefinition(string xml) { ////var serializer = new XmlSerializer(typeof(ApisRoot)); ////var reader = new StringReader(xml); ////var root = (ApisRoot)serializer.Deserialize(reader); MemoryStream stream = new MemoryStream(); StreamWriter writer = new System.IO.StreamWriter(stream); var generator = new CSharpGenerator(writer); var xmlStream = new MemoryStream(); var xmlWriter = new StreamWriter(xmlStream); xmlWriter.Write(xml); xmlWriter.Flush(); xmlStream.Seek(0L, SeekOrigin.Begin); var builder = new ServiceDefinitionBuilder(); ////builder.AppendServiceDefinition(new ServiceDefinition(root)); builder.AppendServiceDefinition(xmlStream); generator.Run(builder.Definition); stream.Seek(0L, SeekOrigin.Begin); var result = new StreamReader(stream).ReadToEnd(); return result; }
public void MyTestMethod() { var stream = new System.IO.MemoryStream(); var writer = new System.IO.StreamWriter(stream); var generator = new CSharpGenerator(writer); var root = new ApisRoot { ApiGroups = new List<ApiGroup>() { new ApiGroup { Name = "g", Methods = new List<ApiMethod>() { new ApiMethod { Path = "/v1/test1", MethodName="mtd1", }, new ApiMethod { Path = "/v1/test1/{UserId}", MethodName="mtd2", }, }, ReturnTypes = new List<ReturnType>(), }, }, }; var builder = new ServiceDefinitionBuilder(); builder.AppendServiceDefinition(new ServiceDefinition(root)); generator.Run(builder.Definition); writer.Flush(); stream.Seek(0L, System.IO.SeekOrigin.Begin); var result = new StreamReader(stream).ReadToEnd(); Assert.IsFalse(string.IsNullOrEmpty(result)); Assert.IsTrue(result.Contains("public void mtd1(")); Assert.IsTrue(result.Contains("public void mtd2(")); Assert.IsTrue(result.Contains("string userId")); }
public void ImplicitSubReturnTypes2() { var xml = @"<?xml version=""1.0"" encoding=""utf-8""?> <Root> <ApiGroup Name=""group""> <ReturnType Name=""person"" ClassName=""Person""> <Field Name=""location:(name)"" /> <Field Name=""location:(country:(code))"" /> </ReturnType> </ApiGroup> </Root>"; var serializer = new XmlSerializer(typeof(ApisRoot)); var reader = new StringReader(xml); var root = (ApisRoot)serializer.Deserialize(reader); var stream = new System.IO.MemoryStream(); var writer = new System.IO.StreamWriter(stream); var generator = new CSharpGenerator(writer); var builder = new ServiceDefinitionBuilder(); builder.AppendServiceDefinition(new ServiceDefinition(root)); generator.Run(builder.Definition); writer.Flush(); stream.Seek(0L, System.IO.SeekOrigin.Begin); var result = new StreamReader(stream).ReadToEnd(); Assert.IsFalse(string.IsNullOrEmpty(result)); }
public void ImplicitSubReturnTypes() { var stream = new System.IO.MemoryStream(); var writer = new System.IO.StreamWriter(stream); var generator = new CSharpGenerator(writer); var root = new ApisRoot { ApiGroups = new List<ApiGroup>() { new ApiGroup { Name = "g", Methods = new List<ApiMethod>(), ReturnTypes = new List<ReturnType>() { new ReturnType { Name = "r1", Fields = new List<Field>() { new Field { Name = "f1", }, new Field { Name = "f2:(r2:(name))", }, }, }, }, }, }, }; var builder = new ServiceDefinitionBuilder(); builder.AppendServiceDefinition(new ServiceDefinition(root)); generator.Run(builder.Definition); writer.Flush(); stream.Seek(0L, System.IO.SeekOrigin.Begin); var result = new StreamReader(stream).ReadToEnd(); Assert.IsFalse(string.IsNullOrEmpty(result)); Assert.IsTrue(result.Contains("public class R1")); Assert.IsTrue(result.Contains("public class F2")); Assert.IsTrue(result.Contains("public string F1")); Assert.IsTrue(result.Contains("public F2 F2")); Assert.IsTrue(result.Contains("public string Name")); }
public void ImplicitAndExplicitReturnTypes() { var xml = @"<?xml version=""1.0"" encoding=""utf-8""?> <Root> <ApiGroup Name=""group""> <ApiMethod MethodName=""ftw"" ReturnType=""Person"" Path=""/ftw"" /> <ReturnType Name=""person"" ClassName=""Person""> <Field Name=""location"" Type=""PersonLocation"" /> </ReturnType> <ReturnType Name=""location"" ClassName=""PersonLocation""> <Field Name=""name"" /> </ReturnType> </ApiGroup> </Root>"; var serializer = new XmlSerializer(typeof(ApisRoot)); var reader = new StringReader(xml); var root = (ApisRoot)serializer.Deserialize(reader); var stream = new System.IO.MemoryStream(); var writer = new System.IO.StreamWriter(stream); var generator = new CSharpGenerator(writer); var builder = new ServiceDefinitionBuilder(); builder.AppendServiceDefinition(new ServiceDefinition(root)); generator.Run(builder.Definition); writer.Flush(); stream.Seek(0L, System.IO.SeekOrigin.Begin); var result = new StreamReader(stream).ReadToEnd(); Assert.IsFalse(string.IsNullOrEmpty(result)); Assert.IsFalse(string.IsNullOrEmpty(result)); Assert.IsTrue(result.Contains("public class Person")); Assert.IsTrue(result.Contains("public class PersonLocation")); Assert.IsTrue(result.Contains("public PersonLocation Location")); Assert.IsFalse(result.Contains("public class Location")); Assert.IsTrue(result.Contains("public string Name")); }