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()); }
/// <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")); }
/// <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")); }
/// <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)); }
/// <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); }
public GoCodeGenerator(Settings settings) : base(settings) { _namingFramework = new GoCodeNamer(); }