Files
mautrix-telegram/pkg/gotd/telegram/query/internal/itergen/special.go
T
2025-06-27 20:03:37 -07:00

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
}