예제 #1
0
        public static string Fields(this CompositeType compositeType)
        {
            var indented   = new IndentedStringBuilder("    ");
            var properties = compositeType.Properties;

            if (compositeType.BaseModelType != null)
            {
                indented.Append(compositeType.BaseModelType.Fields());
            }

            // If the type is a paged model type, ensure the nextLink field exists
            // Note: Inject the field into a copy of the property list so as to not pollute the original list
            if (compositeType is ModelTemplateModel &&
                !String.IsNullOrEmpty((compositeType as ModelTemplateModel).NextLink))
            {
                var nextLinkField = (compositeType as ModelTemplateModel).NextLink;
                foreach (Property p in properties)
                {
                    p.Name = GoCodeNamer.PascalCaseWithoutChar(p.Name, '.');
                    if (p.Name.Equals(nextLinkField, StringComparison.OrdinalIgnoreCase))
                    {
                        p.Name = nextLinkField;
                    }
                }
                if (!properties.Any(p => p.Name.Equals(nextLinkField, StringComparison.OrdinalIgnoreCase)))
                {
                    var property = new Property();
                    property.Name = nextLinkField;
                    property.Type = new PrimaryType(KnownPrimaryType.String)
                    {
                        Name = "string"
                    };
                    properties = new List <Property>(properties);
                    properties.Add(property);
                }
            }

            // Emit each property, except for named Enumerated types, as a pointer to the type
            foreach (var property in properties)
            {
                EnumType enumType = property.Type as EnumType;
                if (enumType != null && enumType.IsNamed())
                {
                    indented.AppendFormat("{0} {1} {2}\n",
                                          property.Name,
                                          enumType.Name,
                                          property.JsonTag());
                }
                else if (property.Type is DictionaryType)
                {
                    indented.AppendFormat("{0} *{1} {2}\n", property.Name, (property.Type as MapType).FieldName, property.JsonTag());
                }
                else
                {
                    indented.AppendFormat("{0} *{1} {2}\n", property.Name, property.Type.Name, property.JsonTag());
                }
            }

            return(indented.ToString());
        }
예제 #2
0
        /// <summary>
        /// Generates Go code for service client.
        /// </summary>
        /// <param name="serviceClient"></param>
        /// <returns></returns>
        public override async Task Generate(ServiceClient serviceClient)
        {
            string packageName = GoCodeNamer.PackageNameFromNamespace(Settings.Namespace);

            // If version is passed in command line then pick that, else keep it 0.0.0(to make it optional for testing).
            string[] version = GoCodeNamer.SDKVersionFromPackageVersion(
                !string.IsNullOrEmpty(Settings.PackageVersion)
                                                    ? Settings.PackageVersion
                                                    : "0.0.0");
            // Service client
            var serviceClientTemplate = new ServiceClientTemplate
            {
                Model = new ServiceClientTemplateModel(serviceClient, packageName),
            };

            await Write(serviceClientTemplate, GoCodeNamer.FormatFileName("client"));

            foreach (var methodGroupName in serviceClient.MethodGroups)
            {
                var groupedMethodTemplate = new MethodGroupTemplate
                {
                    Model = new MethodGroupTemplateModel(serviceClient, packageName, methodGroupName),
                };
                await Write(groupedMethodTemplate, GoCodeNamer.FormatFileName(methodGroupName.ToLowerInvariant()));
            }

            // Models
            var modelsTemplate = new ModelsTemplate
            {
                Model = new ModelsTemplateModel(serviceClient, packageName),
            };

            await Write(modelsTemplate, GoCodeNamer.FormatFileName("models"));

            // Version
            var versionTemplate = new VersionTemplate
            {
                Model = new VersionTemplateModel(serviceClient, packageName, version),
            };

            await Write(versionTemplate, GoCodeNamer.FormatFileName("version"));
        }
예제 #3
0
        /// <summary>
        /// Generates Go code for service client.
        /// </summary>
        /// <param name="serviceClient"></param>
        /// <returns></returns>
        public override async Task Generate(ServiceClient serviceClient)
        {
            string packageName = GoCodeNamer.PackageNameFromNamespace(Settings.Namespace);

            // Service client
            var serviceClientTemplate = new ServiceClientTemplate
            {
                Model = new ServiceClientTemplateModel(serviceClient, packageName),
            };

            await Write(serviceClientTemplate, GoCodeNamer.FormatFileName("client"));

            foreach (var methodGroupName in serviceClient.MethodGroups)
            {
                var groupedMethodTemplate = new MethodGroupTemplate
                {
                    Model = new MethodGroupTemplateModel(serviceClient, packageName, methodGroupName),
                };
                await Write(groupedMethodTemplate, GoCodeNamer.FormatFileName(methodGroupName.ToLowerInvariant()));
            }

            // Models
            var modelsTemplate = new ModelsTemplate
            {
                Model = new ModelsTemplateModel(serviceClient, packageName),
            };

            await Write(modelsTemplate, GoCodeNamer.FormatFileName("models"));

            // Version
            var versionTemplate = new VersionTemplate
            {
                Model = new VersionTemplateModel(serviceClient, packageName),
            };

            await Write(versionTemplate, GoCodeNamer.FormatFileName("version"));
        }
예제 #4
0
        /// <summary>
        /// Return formatted value string for the parameter.
        /// </summary>
        /// <param name="parameter"></param>
        /// <returns></returns>
        public static string ValueForMap(this Parameter parameter)
        {
            if (parameter.SerializedName.IsApiVersion())
            {
                return("client." + ApiVersionName);
            }
            var value = parameter.IsClientProperty()
                ? "client." + GoCodeNamer.PascalCase(parameter.Name)
                : parameter.Name;

            var format = parameter.IsRequired || parameter.Type.CanBeEmpty()
                                          ? "{0}"
                                          : "*{0}";

            var s = parameter.CollectionFormat != CollectionFormat.None
                                  ? $"{format},\"{parameter.CollectionFormat.GetSeparator()}\""
                                  : $"{format}";

            return(string.Format(
                       parameter.RequiresUrlEncoding()
                    ? $"autorest.Encode(\"{parameter.Location.ToString().ToLower()}\",{s})"
                    : $"{s}",
                       value));
        }
예제 #5
0
        /// <summary>
        /// Add NextLink attribute for pageable extension for the method.
        /// </summary>
        /// <param name="method"></param>
        /// <returns></returns>
        public static string NextLink(this Method method)
        {
            var nextLink = "";

            // Note:
            // -- The CSharp generator applies a default link name if the extension is present but the link name is not.
            //    Yet, the MSDN for methods whose nextLink is missing are not paged methods. It appears the CSharp code is
            //    outdated vis a vis the specification.
            // TODO (gosdk): Ensure obtaining the nextLink is correct.
            if (method.Extensions.ContainsKey(AzureExtensions.PageableExtension))
            {
                var pageableExtension = method.Extensions[AzureExtensions.PageableExtension] as Newtonsoft.Json.Linq.JContainer;
                if (pageableExtension != null)
                {
                    var nextLinkName = (string)pageableExtension["nextLinkName"];
                    if (!string.IsNullOrEmpty(nextLinkName))
                    {
                        nextLink = GoCodeNamer.PascalCase(nextLinkName);
                    }
                }
            }

            return(nextLink);
        }
예제 #6
0
 public GoCodeGenerator(Settings settings) : base(settings)
 {
     _namingFramework = new GoCodeNamer();
 }
예제 #7
0
 public GoCodeGenerator(Settings settings) : base(settings)
 {
     _namingFramework = new GoCodeNamer();
 }