move gotd fork into repo. (#111)

- 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
This commit is contained in:
Adam Van Ymeren
2025-06-27 20:03:37 -07:00
committed by GitHub
parent 0952df0244
commit 7a04f298d2
19264 changed files with 1539697 additions and 84 deletions
+101
View File
@@ -0,0 +1,101 @@
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()
}
}