Beispiel #1
0
        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);
        }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
        /// <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());
        }