lbry.go/stream/json.go
2021-10-06 16:28:17 -04:00

110 lines
2.2 KiB
Go

package stream
import (
"encoding/hex"
"encoding/json"
"github.com/cockroachdb/errors"
)
// inspired by https://blog.gopheracademy.com/advent-2016/advanced-encoding-decoding/
type SDBlobAlias SDBlob
type JSONSDBlob struct {
StreamName string `json:"stream_name"`
SDBlobAlias
Key string `json:"key"`
SuggestedFileName string `json:"suggested_file_name"`
StreamHash string `json:"stream_hash"`
}
func (s SDBlob) MarshalJSON() ([]byte, error) {
var tmp JSONSDBlob
tmp.StreamName = hex.EncodeToString([]byte(s.StreamName))
tmp.StreamHash = hex.EncodeToString(s.StreamHash)
tmp.SuggestedFileName = hex.EncodeToString([]byte(s.SuggestedFileName))
tmp.Key = hex.EncodeToString(s.Key)
tmp.SDBlobAlias = SDBlobAlias(s)
return json.Marshal(tmp)
}
func (s *SDBlob) UnmarshalJSON(b []byte) error {
var tmp JSONSDBlob
err := json.Unmarshal(b, &tmp)
if err != nil {
return errors.WithStack(err)
}
*s = SDBlob(tmp.SDBlobAlias)
str, err := hex.DecodeString(tmp.StreamName)
if err != nil {
return errors.WithStack(err)
}
s.StreamName = string(str)
str, err = hex.DecodeString(tmp.SuggestedFileName)
if err != nil {
return errors.WithStack(err)
}
s.SuggestedFileName = string(str)
s.StreamHash, err = hex.DecodeString(tmp.StreamHash)
if err != nil {
return errors.WithStack(err)
}
s.Key, err = hex.DecodeString(tmp.Key)
if err != nil {
return errors.WithStack(err)
}
return nil
}
type BlobInfoAlias BlobInfo
type JSONBlobInfo struct {
BlobInfoAlias
BlobHash string `json:"blob_hash,omitempty"`
IV string `json:"iv"`
}
func (bi BlobInfo) MarshalJSON() ([]byte, error) {
var tmp JSONBlobInfo
tmp.IV = hex.EncodeToString(bi.IV)
if len(bi.BlobHash) > 0 {
tmp.BlobHash = hex.EncodeToString(bi.BlobHash)
}
tmp.BlobInfoAlias = BlobInfoAlias(bi)
return json.Marshal(tmp)
}
func (bi *BlobInfo) UnmarshalJSON(b []byte) error {
var tmp JSONBlobInfo
err := json.Unmarshal(b, &tmp)
if err != nil {
return errors.WithStack(err)
}
*bi = BlobInfo(tmp.BlobInfoAlias)
bi.BlobHash, err = hex.DecodeString(tmp.BlobHash)
if err != nil {
return errors.WithStack(err)
}
bi.IV, err = hex.DecodeString(tmp.IV)
if err != nil {
return errors.WithStack(err)
}
return nil
}