fix: work around invalid all_time_since_today data schema to fix failing import (resolve #370)

This commit is contained in:
Ferdinand Mütsch 2022-05-12 00:59:42 +02:00
parent 1b7baf6fc9
commit 09d1124794
2 changed files with 38 additions and 2 deletions

View File

@ -7,6 +7,7 @@ import (
"errors" "errors"
"fmt" "fmt"
"github.com/duke-git/lancet/v2/datetime" "github.com/duke-git/lancet/v2/datetime"
"github.com/muety/wakapi/utils"
"net/http" "net/http"
"time" "time"
@ -154,8 +155,9 @@ func (w *WakatimeHeartbeatImporter) fetchRange(baseUrl string) (time.Time, time.
return notime, notime, err return notime, notime, err
} }
var allTimeData wakatime.AllTimeViewModel // see https://github.com/muety/wakapi/issues/370
if err := json.NewDecoder(res.Body).Decode(&allTimeData); err != nil { allTimeData, err := utils.ParseJsonDropKeys[wakatime.AllTimeViewModel](res.Body, "text")
if err != nil {
return notime, notime, err return notime, notime, err
} }

34
utils/json.go Normal file
View File

@ -0,0 +1,34 @@
package utils
import (
"bytes"
"encoding/json"
"io"
)
// ParseJsonDropKeys parses the given JSON input object to an object of given type, while omitting the specified keys on the way.
// This can be useful if parsing would normally fail due to ambiguous typing of some key, but that key is not of interest and can be dropped to avoid parse errors.
// Dropping keys only works on top level of the object.
func ParseJsonDropKeys[T any](r io.Reader, dropKeys ...string) (T, error) {
var (
result T
resultTmp map[string]interface{}
resultTmpBuf = new(bytes.Buffer)
)
if err := json.NewDecoder(r).Decode(&resultTmp); err != nil {
return result, err
}
for _, k := range dropKeys {
delete(resultTmp, k)
}
if err := json.NewEncoder(resultTmpBuf).Encode(resultTmp); err != nil {
return result, err
}
if err := json.NewDecoder(resultTmpBuf).Decode(&result); err != nil {
return result, err
}
return result, nil
}