Chaos.Autorest/custom/csharp/RestErrorHandler.cs
|
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information. namespace Microsoft.Azure.PowerShell.Cmdlets.Chaos.Cmdlets { using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Text; using System.Threading.Tasks; using System.Management.Automation; using Microsoft.Azure.PowerShell.Cmdlets.Chaos.Models; internal static class CmdletRestExtension { public static void writeError(this Cmdlet cmdlet, HttpResponseMessage responseMessage, Task<IErrorResponse> errorResponseTask, ref Task<bool> returnNow) { string code; string message; if (!TryCreateDetailedErrorMessage(errorResponseTask, out code, out message)) { return; } cmdlet.WriteError(new ErrorRecord(new System.Exception(message), code, ErrorCategory.InvalidOperation, new { }) { ErrorDetails = new ErrorDetails(message) { RecommendedAction = string.Empty } }); returnNow = Task.FromResult(true); } internal static bool TryCreateDetailedErrorMessage(Task<IErrorResponse> errorResponseTask, out string code, out string message) { code = null; message = null; IErrorResponse error; try { error = errorResponseTask.ConfigureAwait(false).GetAwaiter().GetResult(); } catch { return false; } if (error == null || error.Detail == null || error.Detail.Count == 0 || string.IsNullOrEmpty(error.Code) || string.IsNullOrEmpty(error.Message)) { return false; } code = error.Code; message = FormatErrorWithDetails(error); return true; } private static string FormatErrorWithDetails(IErrorResponse error) { var builder = new StringBuilder(); builder.AppendFormat("[{0}] : {1}", error.Code, error.Message); AppendDetails(builder, error.Detail, 0, 5); return builder.ToString(); } private static void AppendDetails(StringBuilder builder, IList<IErrorDetail> details, int depth, int maxDepth) { if (details == null || details.Count == 0 || depth >= maxDepth) { return; } var indent = new string(' ', (depth * 2) + 2); foreach (var detail in details) { if (detail == null) { continue; } builder.AppendLine(); builder.Append(indent).Append("- "); if (!string.IsNullOrEmpty(detail.Target)) { builder.AppendFormat("Target: {0}; ", detail.Target); } if (!string.IsNullOrEmpty(detail.Code)) { builder.AppendFormat("Code: {0}; ", detail.Code); } builder.AppendFormat("Message: {0}", detail.Message ?? string.Empty); AppendDetails(builder, detail.Detail, depth + 1, maxDepth); } } } } |