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
120 lines
2.9 KiB
Cheetah
120 lines
2.9 KiB
Cheetah
{{ define "header" }}{{- /*gotype: go.mau.fi/mautrix-telegram/pkg/gotd/telegram/query/internal/cachedgen.Config*/ -}}
|
|
// Code generated by itergen, DO NOT EDIT.
|
|
|
|
package {{ $.Package }}
|
|
|
|
import (
|
|
"context"
|
|
"sync/atomic"
|
|
|
|
"github.com/go-faster/errors"
|
|
|
|
"go.mau.fi/mautrix-telegram/pkg/gotd/tg"
|
|
)
|
|
|
|
// No-op definition for keeping imports.
|
|
var _ = context.Background()
|
|
|
|
{{ range $query := $.Queries }}
|
|
|
|
type inner{{ $query.Name }} struct {
|
|
// Last received hash.
|
|
hash int64
|
|
// Last received result.
|
|
value *tg.{{ $query.ResultName }}
|
|
}
|
|
|
|
type {{ $query.Name }} struct {
|
|
{{- if $query.RequestParams }}
|
|
// Query to send.
|
|
req *tg.{{ $query.RequestName }}{{ end }}
|
|
// Result state.
|
|
last atomic.Value
|
|
|
|
// Reference to RPC client to make requests.
|
|
raw *tg.Client
|
|
}
|
|
|
|
// New{{ $query.Name }} creates new {{ $query.Name }}.
|
|
func New{{ $query.Name }}(raw *tg.Client, {{- if $query.RequestParams }}initial *tg.{{ $query.RequestName }}{{- end }}) *{{ $query.Name }} {
|
|
q := &{{ $query.Name }}{
|
|
{{- if $query.RequestParams }}
|
|
req: initial,{{ end }}
|
|
raw: raw,
|
|
}
|
|
|
|
return q
|
|
}
|
|
|
|
func (s *{{ $query.Name }}) store(v inner{{ $query.Name }}) {
|
|
s.last.Store(v)
|
|
}
|
|
|
|
func (s *{{ $query.Name }}) load() (inner{{ $query.Name }}, bool) {
|
|
v, ok := s.last.Load().(inner{{ $query.Name }})
|
|
return v, ok
|
|
}
|
|
|
|
// Value returns last received result.
|
|
// NB: May be nil. Returned {{ $query.ResultName }} must not be mutated.
|
|
func (s *{{ $query.Name }}) Value() *tg.{{ $query.ResultName }} {
|
|
inner, _ := s.load()
|
|
return inner.value
|
|
}
|
|
|
|
// Hash returns last received hash.
|
|
func (s *{{ $query.Name }}) Hash() int64 {
|
|
inner, _ := s.load()
|
|
return inner.hash
|
|
}
|
|
|
|
// Get updates data if needed and returns it.
|
|
func (s *{{ $query.Name }}) Get(ctx context.Context) (*tg.{{ $query.ResultName }}, error) {
|
|
if _, err := s.Fetch(ctx); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return s.Value(), nil
|
|
}
|
|
|
|
// Fetch updates data if needed and returns true if data was modified.
|
|
func (s *{{ $query.Name }}) Fetch(ctx context.Context) (bool, error) {
|
|
lastHash := s.Hash()
|
|
|
|
{{ if $query.RequestParams -}}
|
|
req := s.req
|
|
req.Hash = lastHash
|
|
{{- else -}}
|
|
req := lastHash
|
|
{{- end }}
|
|
result, err := s.raw.{{ $query.MethodName }}(ctx, req)
|
|
if err != nil {
|
|
return false, errors.Wrap(err, "execute {{ $query.MethodName }}")
|
|
}
|
|
|
|
switch variant := result.(type) {
|
|
case *tg.{{ $query.ResultName }}:
|
|
{{ if $query.ManualHash -}}
|
|
hash := s.computeHash(variant)
|
|
{{- else -}}
|
|
hash := variant.Hash
|
|
{{- end }}
|
|
|
|
s.store(inner{{ $query.Name }}{
|
|
hash: hash,
|
|
value: variant,
|
|
})
|
|
return true, nil
|
|
case *tg.{{ $query.NotModifiedName }}:
|
|
if lastHash == 0 {
|
|
return false, errors.Errorf("got unexpected %T result", result)
|
|
}
|
|
return false, nil
|
|
default:
|
|
return false, errors.Errorf("unexpected type %T", result)
|
|
}
|
|
}
|
|
{{ end }}
|
|
|
|
{{ end }}
|