unmasrshal_url.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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 IsDataExists(url string) (bool, error) {
  52. var interfaceJson interface{}
  53. err := UnmasrshalFromUrl(url, &interfaceJson)
  54. if err != nil {
  55. return false, err
  56. }
  57. switch interfaceJson.(map[string]interface{})["data"].(type) {
  58. case string:
  59. if interfaceJson.(map[string]interface{})["data"].(string) == "NO DATA" {
  60. return false, nil
  61. }
  62. return false, fmt.Errorf("unexpected string value at interface %v", interfaceJson.(map[string]interface{})["data"].(string))
  63. break
  64. case map[string]interface {}:
  65. return true, nil
  66. break
  67. default:
  68. return false, fmt.Errorf("unexpected type of Data at interface - %T", interfaceJson.(map[string]interface{})["data"])
  69. break
  70. }
  71. return false, nil
  72. }