public static string GetTableFromResource(PveClient client, string resource) { var result = client.Get(resource); var ret = ""; if (!result.IsSuccessStatusCode) { ret = result.ReasonPhrase; } else { var returnParameters = GetClassApiReturnParameters(resource); if (returnParameters == null || returnParameters.Count == 0) { ret = TableHelper.CreateTable(result.Response.data); } else { var keys = returnParameters.OrderBy(a => a.Optional) .ThenBy(a => a.Name) .Select(a => a.Name) .ToArray(); ret = TableHelper.CreateTable(result.Response.data, keys, returnParameters); } } return(ret); }
/// <summary> /// List values resource /// </summary> /// <param name="client"></param> /// <param name="classApiRoot"></param> /// <param name="resource"></param> /// <returns></returns> public static (IEnumerable <(string Attribute, string Value)> Values, string Error) ListValues(PveClient client, ClassApi classApiRoot, string resource) { var values = new List <(string Attribute, string Value)>(); var error = ""; var classApi = ClassApi.GetFromResource(classApiRoot, resource); if (classApi == null) { error = $"no such resource '{resource}'"; } else { if (classApi.SubClasses.Count == 0) { error = $"resource '{resource}' does not define child links"; } else { string key = null; foreach (var subClass in classApi.SubClasses.OrderBy(a => a.Name)) { var attribute = string.Join("", new[] { subClass.SubClasses.Count > 0 ? "D" : "-", "r--", subClass.Methods.Any(a => a.IsPost)? "c" : "-" }); if (subClass.IsIndexed) { var result = client.Get(resource); if (result.InError()) { error = result.GetError(); } else { if (key == null) { key = classApi.Methods.Where(a => a.IsGet) .FirstOrDefault() .ReturnLinkHRef .Replace("{", "") .Replace("}", ""); } if (result.Response.data != null) { var data = new List <object>(); foreach (IDictionary <string, object> item in result.Response.data) { data.Add(item[key]); } foreach (var item in data.OrderBy(a => a)) { values.Add((attribute, item + "")); } } } } else { values.Add((attribute, subClass.Name)); } } } } return(values, error); }
/// <summary> /// Execute methods /// </summary> /// <param name="client"></param> /// <param name="classApiRoot"></param> /// <param name="resource"></param> /// <param name="methodType"></param> /// <param name="parameters"></param> /// <param name="wait"></param> /// <param name="outputType"></param> /// <param name="verbose"></param> public static (int ResultCode, string ResultText) Execute(PveClient client, ClassApi classApiRoot, string resource, MethodType methodType, Dictionary <string, object> parameters, bool wait = false, OutputType outputType = OutputType.Unicode, bool verbose = false) { var currResponseType = client.ResponseType; if (outputType == OutputType.Png) { client.ResponseType = ResponseType.Png; } //create result Result result = null; switch (methodType) { case MethodType.Get: result = client.Get(resource, parameters); break; case MethodType.Set: result = client.Set(resource, parameters); break; case MethodType.Create: result = client.Create(resource, parameters); break; case MethodType.Delete: result = client.Delete(resource, parameters); break; } //restore prev ResponseType currResponseType = client.ResponseType; var resultText = new StringBuilder(); if (result != null && !result.IsSuccessStatusCode) { resultText.AppendLine(result.ReasonPhrase); resultText.AppendLine(verbose ? PveClient.ObjectToJson((string)result.Response.errors) : result.GetError()); } else if (result.InError()) { resultText.AppendLine(result.ReasonPhrase); } else { //print result if (verbose) { //verbose full response json resultText.AppendLine(PveClient.ObjectToJson(result.Response)); } else { switch (outputType) { case OutputType.Png: resultText.AppendLine(result.Response); break; case OutputType.Json: resultText.AppendLine(PveClient.ObjectToJson(result.Response.data, false)); break; case OutputType.JsonPretty: resultText.AppendLine(PveClient.ObjectToJson(result.Response.data)); break; case OutputType.Text: case OutputType.Html: case OutputType.Unicode: case OutputType.UnicodeAlt: case OutputType.Markdown: var data = result.Response.data; var tableOutput = DecodeOutputType(outputType); var classApi = ClassApi.GetFromResource(classApiRoot, resource); if (classApi == null) { resultText.AppendLine($"no such resource '{resource}'"); } else { var returnParameters = classApi.Methods .Where(a => a.IsGet) .FirstOrDefault() .ReturnParameters; if (returnParameters.Count == 0) { //no return defined resultText.Append(TableHelper.Create(data, null, false, tableOutput, null)); } else { var keys = returnParameters.OrderBy(a => a.Optional) .ThenBy(a => a.Name) .Select(a => a.Name) .ToArray(); resultText.Append(TableHelper.Create(data, keys, false, tableOutput, returnParameters)); } } break; default: break; } } if (wait) { var task = (string)result.Response.data; client.WaitForTaskToFinish(task.Split(':')[1], task, 1000, 30000); } } return((int)result.StatusCode, resultText.ToString()); }