unmasrshal_url.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io"
  6. "net/http"
  7. "strings"
  8. )
  9. func UnmasrshalFromUrl(url string, v interface{}) error {
  10. // Usage:
  11. // <url> - string with web url to raw json data
  12. // <JsonStruct> - struct type that describes json data at <url>
  13. //
  14. // -- code --
  15. // var parseTo <JsonStruct>
  16. // err := UnmasrshalFromUrl(<url>, &parseTo)
  17. // -- code --
  18. webClient := &http.Client{}
  19. // Get response from url
  20. webResp, err := webClient.Get(url)
  21. if err != nil {
  22. return err
  23. }
  24. // Close response body
  25. defer webResp.Body.Close()
  26. // Convert from Reader to []byte
  27. jsonData, err := io.ReadAll(webResp.Body)
  28. if err != nil {
  29. return err
  30. }
  31. // Convert []byte to string
  32. jsonDataStr := fmt.Sprintf("%s", jsonData)
  33. jsonDataStr = strings.ReplaceAll(jsonDataStr, "null", "0")
  34. // Covenrt string ot []byte
  35. jsonData = []byte(jsonDataStr)
  36. // LogDebug.Println(v)
  37. return json.Unmarshal([]byte(jsonData), &v)
  38. }
  39. func MinerStats(url string) (JsonCurrentStats, error) {
  40. var currentStats JsonCurrentStats
  41. urlToStats := url + "/currentStats"
  42. dataExists, err := IsDataExists(urlToStats)
  43. if err != nil {
  44. return currentStats, err
  45. }
  46. if !dataExists {
  47. return currentStats, fmt.Errorf("No data for miner %s", urlToStats)
  48. }
  49. return currentStats, UnmasrshalFromUrl(urlToStats, &currentStats)
  50. }
  51. func Workers(url string) (JsonWorker, error) {
  52. var workers JsonWorker
  53. urlToWorkers := url + "/workers"
  54. dataExists, err := IsDataExists(urlToWorkers)
  55. if err != nil {
  56. return workers, err
  57. }
  58. if !dataExists {
  59. return workers, fmt.Errorf("No data for workers %s", urlToWorkers)
  60. }
  61. return workers, UnmasrshalFromUrl(urlToWorkers, &workers)
  62. }
  63. func IsDataExists(url string) (bool, error) {
  64. var interfaceJson interface{}
  65. err := UnmasrshalFromUrl(url, &interfaceJson)
  66. if err != nil {
  67. return false, err
  68. }
  69. switch interfaceJson.(map[string]interface{})["data"].(type) {
  70. case string:
  71. if interfaceJson.(map[string]interface{})["data"].(string) == "NO DATA" {
  72. return false, nil
  73. }
  74. return false, fmt.Errorf("unexpected string value at interface %v", interfaceJson.(map[string]interface{})["data"].(string))
  75. break
  76. case map[string]interface {}:
  77. return true, nil
  78. break
  79. case []interface {}:
  80. return true, nil
  81. break
  82. default:
  83. return false, fmt.Errorf("unexpected type of Data at interface - %T", interfaceJson.(map[string]interface{})["data"])
  84. break
  85. }
  86. return false, nil
  87. }