mirror of
https://github.com/fumiama/tienyik.git
synced 2026-06-04 23:10:26 +08:00
57 lines
1012 B
Go
57 lines
1012 B
Go
package hson
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
"errors"
|
|
"io"
|
|
"strconv"
|
|
|
|
"github.com/fumiama/tienyik"
|
|
"github.com/fumiama/tienyik/internal/log"
|
|
)
|
|
|
|
type responseBase[T any] struct {
|
|
Code int `json:"code"`
|
|
Msg string `json:"msg"`
|
|
Data T `json:"data"`
|
|
EData string `json:"edata"`
|
|
}
|
|
|
|
func (rb *responseBase[T]) ok() error {
|
|
if rb.Code != 0 {
|
|
return errors.New("[" + strconv.Itoa(rb.Code) + "] " + rb.Msg)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func Unmarshal[T any](tya *tienyik.AES, r io.Reader) (data T, err error) {
|
|
var rsp responseBase[T]
|
|
err = json.NewDecoder(r).Decode(&rsp)
|
|
if err == nil {
|
|
err = rsp.ok()
|
|
}
|
|
if err != nil {
|
|
return
|
|
}
|
|
if len(rsp.EData) > 0 && tya != nil {
|
|
var d []byte
|
|
d, err = base64.StdEncoding.DecodeString(rsp.EData)
|
|
if err != nil {
|
|
return
|
|
}
|
|
d, err = tya.Decrypt(d)
|
|
if err != nil {
|
|
return
|
|
}
|
|
log.Debugln("decrypted data:", string(d))
|
|
err = json.Unmarshal(d, &rsp)
|
|
if err != nil {
|
|
return
|
|
}
|
|
err = rsp.ok()
|
|
}
|
|
data = rsp.Data
|
|
return
|
|
}
|