7a04f298d2
- update to latest telegram layer - remove some references to fields in tg.Entities that don't exist in the schema - originally added here: https://github.com/beeper/td/commit/820929062a2ba0104397bc01235ab58a9cff780e - referenced here - https://github.com/mautrix/telegramgo/commit/124f0967ed195b5a380c9bd02e170ada9710dde3 - https://github.com/mautrix/telegramgo/commit/4205047aab2e0639217148b5d125bfaab668bd8e
102 lines
2.0 KiB
Go
102 lines
2.0 KiB
Go
package tljson
|
|
|
|
import (
|
|
"github.com/go-faster/errors"
|
|
"github.com/go-faster/jx"
|
|
|
|
"go.mau.fi/mautrix-telegram/pkg/gotd/tg"
|
|
)
|
|
|
|
// Decode decodes JSON and converts it to tg.JSONValueClass.
|
|
func Decode(d *jx.Decoder) (tg.JSONValueClass, error) {
|
|
switch tt := d.Next(); tt {
|
|
case jx.String:
|
|
s, err := d.Str()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &tg.JSONString{Value: s}, nil
|
|
case jx.Number:
|
|
f, err := d.Float64()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &tg.JSONNumber{Value: f}, nil
|
|
case jx.Null:
|
|
if err := d.Null(); err != nil {
|
|
return nil, err
|
|
}
|
|
return &tg.JSONNull{}, nil
|
|
case jx.Bool:
|
|
b, err := d.Bool()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &tg.JSONBool{Value: b}, nil
|
|
case jx.Array:
|
|
var r []tg.JSONValueClass
|
|
if err := d.Arr(func(d *jx.Decoder) error {
|
|
obj, err := Decode(d)
|
|
if err != nil {
|
|
return errors.Wrapf(err, "decode %d element", len(r))
|
|
}
|
|
|
|
r = append(r, obj)
|
|
return nil
|
|
}); err != nil {
|
|
return nil, err
|
|
}
|
|
return &tg.JSONArray{Value: r}, nil
|
|
case jx.Object:
|
|
var r []tg.JSONObjectValue
|
|
if err := d.Obj(func(d *jx.Decoder, key string) error {
|
|
obj, err := Decode(d)
|
|
if err != nil {
|
|
return errors.Wrapf(err, "decode %q", key)
|
|
}
|
|
|
|
r = append(r, tg.JSONObjectValue{
|
|
Key: key,
|
|
Value: obj,
|
|
})
|
|
return nil
|
|
}); err != nil {
|
|
return nil, err
|
|
}
|
|
return &tg.JSONObject{Value: r}, nil
|
|
default:
|
|
return nil, errors.Errorf("unexpected type %v", tt)
|
|
}
|
|
}
|
|
|
|
// Encode writes given value to Encoder.
|
|
func Encode(obj tg.JSONValueClass, e *jx.Encoder) {
|
|
switch obj := obj.(type) {
|
|
case *tg.JSONNull:
|
|
e.Null()
|
|
case *tg.JSONBool:
|
|
e.Bool(obj.Value)
|
|
case *tg.JSONNumber:
|
|
if v := int64(obj.Value); float64(v) == obj.Value {
|
|
e.Int64(v)
|
|
} else {
|
|
e.Float64(obj.Value)
|
|
}
|
|
case *tg.JSONString:
|
|
e.Str(obj.Value)
|
|
case *tg.JSONArray:
|
|
e.ArrStart()
|
|
for _, v := range obj.Value {
|
|
Encode(v, e)
|
|
}
|
|
e.ArrEnd()
|
|
case *tg.JSONObject:
|
|
e.ObjStart()
|
|
for _, pair := range obj.Value {
|
|
e.FieldStart(pair.Key)
|
|
Encode(pair.Value, e)
|
|
}
|
|
e.ObjEnd()
|
|
}
|
|
}
|