Browse Source

unmarshal_url.go decomposition

TooManySugar 3 years ago
parent
commit
7a775f574a
1 changed files with 70 additions and 30 deletions
  1. 70 30
      ethermineapi/unmasrshal_url.go

+ 70 - 30
ethermineapi/unmasrshal_url.go

@@ -8,6 +8,35 @@ import (
 	"strings"
 )
 
+
+// downloadJsonFromUrl downloadns []byte from body of web response of GET url
+func downloadBytesUrl(url string) (jsonData []byte, err error) {
+	webClient := &http.Client{}
+	// Get response from url
+	webResp, err := webClient.Get(url)
+	if err != nil {
+		return nil, err
+	}
+	// Close response body
+	defer webResp.Body.Close()
+	// Convert from Reader to []byte
+	jsonData, err = io.ReadAll(webResp.Body)
+	if err != nil {
+		return nil, err
+	}
+
+	return jsonData, nil
+}  
+
+func removeNulls(data []byte) []byte{
+	// Convert []byte to string
+	dataStr := fmt.Sprintf("%s", data)
+	dataStr = strings.ReplaceAll(dataStr, "null", "0")
+
+	// Covenrt string ot []byte
+	return []byte(dataStr)	
+}  
+
 // Unmarahals JSON from specified url to v 
 // Usage example:
 // <url> - string with web url to raw json data
@@ -18,27 +47,17 @@ import (
 //    err := UnmasrshalFromUrl(<url>, &parseTo)
 //    -- code --
 func UnmasrshalFromUrl(url string, v interface{}) error {
-	webClient := &http.Client{}
-	// Get response from url
-	webResp, err := webClient.Get(url)
-	if err != nil {
-		return err
-	}
-	// Close response body
-	defer webResp.Body.Close()
-	// Convert from Reader to []byte
-	jsonData, err := io.ReadAll(webResp.Body)
+	// err := downloadJsonFromUrl(url)
+
+	jsonData, err := downloadBytesUrl(url)
 	if err != nil {
 		return err
 	}
-	// Convert []byte to string
-	jsonDataStr := fmt.Sprintf("%s", jsonData)
-	jsonDataStr = strings.ReplaceAll(jsonDataStr, "null", "0")
-	// Covenrt string ot []byte
-	jsonData = []byte(jsonDataStr)
+
+	jsonData = removeNulls(jsonData)
 
 	// LogDebug.Println(v)
-	return json.Unmarshal([]byte(jsonData), &v)
+	return  json.Unmarshal([]byte(jsonData), &v)
 }
 
 
@@ -46,7 +65,12 @@ func MinerStats(pool, wallet string) (JsonCurrentStats, error) {
 	var currentStats JsonCurrentStats
 
 	url := fmt.Sprintf("%s/miner/%s/currentStats", pool, wallet)
-	dataExists, err := IsDataExists(url)
+	jsonData, err := downloadBytesUrl(url)
+	if err != nil {
+		return currentStats, err
+	}
+
+	dataExists, err := IsDataExists(jsonData)
 	if err != nil {
 		return currentStats, err
 	}
@@ -55,14 +79,20 @@ func MinerStats(pool, wallet string) (JsonCurrentStats, error) {
 		return currentStats, fmt.Errorf("no data for miner %s", wallet)
 	}
 
-	return currentStats, UnmasrshalFromUrl(url, &currentStats)
+	return currentStats, json.Unmarshal(jsonData, &currentStats)//UnmasrshalFromUrl(url, &currentStats)
 }
 
 func Workers(pool, wallet string) (JsonWorker, error) {
 	var workers JsonWorker
 
 	url := fmt.Sprintf("%s/miner/%s/workers", pool, wallet)
-	dataExists, err := IsDataExists(url)
+
+	jsonData, err := downloadBytesUrl(url)
+	if err != nil {
+		return workers, err
+	}
+
+	dataExists, err := IsDataExists(jsonData)
 	if err != nil {
 		return workers, err
 	}
@@ -71,14 +101,21 @@ func Workers(pool, wallet string) (JsonWorker, error) {
 		return workers, fmt.Errorf("no data for workers of %s", wallet)
 	}
 
-	return workers, UnmasrshalFromUrl(url, &workers)
+	return workers, json.Unmarshal(jsonData, &workers)//UnmasrshalFromUrl(url, &workers)
 }
 
 func Payouts(pool, wallet string) (JsonPayouts, error) {
     var payouts JsonPayouts
 
 	url := fmt.Sprintf("%s/miner/%s/payouts", pool, wallet)
-	// dataExists, err := IsDataExists(url) Not needed for payouts
+
+	jsonData, err := downloadBytesUrl(url)
+	if err != nil {
+		return payouts, fmt.Errorf("couldn't get payouts from %s\n%v", url, err)
+	}
+
+	// Not needed for payouts
+	// dataExists, err := IsDataExists(url)
 	// if err != nil {
 	// 	return payouts, err
 	// }
@@ -86,25 +123,28 @@ func Payouts(pool, wallet string) (JsonPayouts, error) {
 	// if !dataExists {
 	// 	return workers, fmt.Errorf("no data for workers of %s", wallet)
 	// }
-	err := UnmasrshalFromUrl(url, &payouts)
+	
+	err = json.Unmarshal(jsonData, &payouts) 
 	if err != nil {
-		return payouts, fmt.Errorf("couldn't get payouts from %s", url)
+		return payouts, fmt.Errorf("couldn't parse payouts from %s\n%v", url, err)
 	}
 
-	return payouts, err
+	return payouts, nil
 }
 
-func IsDataExists(url string) (bool, error) {
+// IsDataExists checks if Data part of json is not string
+// TODO Redo this using dynamic Json unmarshaling 
+func IsDataExists(data [] byte) (bool, error) {
+
 	var base baseResponce
-	
-	err := UnmasrshalFromUrl(url, &base)
+	err := json.Unmarshal(data, &base)
 	if err != nil {
-		return false, fmt.Errorf("couldn't get base response from %s", url)
+		return false, fmt.Errorf("couldn't get base response from %s")
 	}
-
+	
 	if string(base.Data) == "\"NO DATA\"" {
 		return false, nil
 	}
 
 	return true, nil
-}
+}