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
91 lines
1.9 KiB
Go
91 lines
1.9 KiB
Go
package main
|
|
|
|
import (
|
|
"go/types"
|
|
"sort"
|
|
"strings"
|
|
|
|
"github.com/go-faster/errors"
|
|
|
|
"go.mau.fi/mautrix-telegram/pkg/gotd/telegram/query/internal/genutil"
|
|
)
|
|
|
|
func (c *collector) unpackClass(
|
|
field Param,
|
|
typeName, trimPrefix string,
|
|
) ([]SpecialCaseChain, error) {
|
|
var r []SpecialCaseChain
|
|
if field.Type == "tg."+typeName {
|
|
impls, err := c.ifaces.Implementations(typeName)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "find %q constructors", typeName)
|
|
}
|
|
for _, impl := range impls {
|
|
s, ok := impl.Underlying().(*types.Struct)
|
|
if !ok {
|
|
continue
|
|
}
|
|
|
|
cse := SpecialCaseChain{
|
|
ConstructorName: strings.TrimPrefix(impl.Obj().Name(), trimPrefix),
|
|
ConstructorType: genutil.PrintType(impl),
|
|
Field: field,
|
|
}
|
|
|
|
if strings.Contains(cse.ConstructorName, "Empty") {
|
|
continue
|
|
}
|
|
|
|
for i := 0; i < s.NumFields(); i++ {
|
|
field := s.Field(i)
|
|
if field.Name() == "Flags" {
|
|
continue
|
|
}
|
|
|
|
cse.Args = append(cse.Args, varToParam(field))
|
|
}
|
|
|
|
cse.Args = sortParams(cse.Args)
|
|
r = append(r, cse)
|
|
}
|
|
}
|
|
|
|
return r, nil
|
|
}
|
|
|
|
func (c *collector) unpackClasses(
|
|
field Param,
|
|
classes ...[2]string,
|
|
) ([]SpecialCaseChain, error) {
|
|
var r []SpecialCaseChain
|
|
for _, class := range classes {
|
|
cases, err := c.unpackClass(field, class[0], class[1])
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "unpack %q", class[0])
|
|
}
|
|
r = append(r, cases...)
|
|
}
|
|
|
|
return r, nil
|
|
}
|
|
|
|
func (c *collector) collectSpecial(m Method) ([]SpecialCaseChain, error) {
|
|
var r []SpecialCaseChain
|
|
for _, field := range m.AdditionalParams {
|
|
cases, err := c.unpackClasses(field, [][2]string{
|
|
{"MessagesFilterClass", "InputMessagesFilter"},
|
|
{"ChannelParticipantsFilterClass", "ChannelParticipants"},
|
|
}...)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
r = append(r, cases...)
|
|
}
|
|
|
|
sort.SliceStable(r, func(i, j int) bool {
|
|
return r[i].ConstructorName < r[j].ConstructorName
|
|
})
|
|
return r, nil
|
|
}
|