コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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;
        }
コード例 #4
0
        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"));
        }
コード例 #5
0
        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));
        }
コード例 #6
0
        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"));
        }
コード例 #7
0
        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"));
        }