mirror of
https://github.com/lukaszraczylo/go-telegram.git
synced 2026-06-05 22:43:59 +00:00
feat(api): add api.Ptr helper for optional scalar fields
Telegram's optional int/bool/float fields are pointers so callers can explicitly send false or 0 to override a chat default — distinct from 'absent', which uses the chat default. The pointer construction has been ergonomically painful: photoLimit := int64(5) Limit: &photoLimit api.Ptr[T any](v T) *T collapses that to a single line: Limit: api.Ptr[int64](5) DisableNotification: api.Ptr(true) Pointers stay because the explicit-zero distinction matters for fields like DisableNotification, ProtectContent, and getUpdates.Offset where sending 0 / false explicitly is semantically different from omitting the field.
This commit is contained in:
@@ -141,6 +141,25 @@ Run any example: `TELEGRAM_BOT_TOKEN=xxx go run ./examples/<name>`
|
|||||||
| | [`polls`](examples/polls) | `sendPoll` and answer tally |
|
| | [`polls`](examples/polls) | `sendPoll` and answer tally |
|
||||||
| | [`payments`](examples/payments) | Invoice → pre-checkout → success |
|
| | [`payments`](examples/payments) | Invoice → pre-checkout → success |
|
||||||
|
|
||||||
|
## Optional fields
|
||||||
|
|
||||||
|
Telegram marks many fields as optional. For optional **scalars** (int, bool, float) we use pointers so you can explicitly send `false` or `0` when the wire format needs to override a chat default. The `api.Ptr` helper keeps that ergonomic:
|
||||||
|
|
||||||
|
```go
|
||||||
|
api.SendMessage(ctx, bot, &api.SendMessageParams{
|
||||||
|
ChatID: api.ChatIDFromInt(chatID),
|
||||||
|
Text: "hi",
|
||||||
|
DisableNotification: api.Ptr(true), // type inferred
|
||||||
|
})
|
||||||
|
|
||||||
|
api.GetUserProfilePhotos(ctx, bot, &api.GetUserProfilePhotosParams{
|
||||||
|
UserID: userID,
|
||||||
|
Limit: api.Ptr[int64](5), // explicit type for untyped literals
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
Optional structs and slices are already nullable in Go — no helper needed.
|
||||||
|
|
||||||
## Reference docs
|
## Reference docs
|
||||||
|
|
||||||
Full API reference is auto-generated from source comments and lives in [`docs/reference/`](docs/reference/README.md) — browse package by package on GitHub, or read it rendered at [go-telegram.raczylo.com](https://go-telegram.raczylo.com/) and [pkg.go.dev](https://pkg.go.dev/github.com/lukaszraczylo/go-telegram).
|
Full API reference is auto-generated from source comments and lives in [`docs/reference/`](docs/reference/README.md) — browse package by package on GitHub, or read it rendered at [go-telegram.raczylo.com](https://go-telegram.raczylo.com/) and [pkg.go.dev](https://pkg.go.dev/github.com/lukaszraczylo/go-telegram).
|
||||||
|
|||||||
+16
@@ -0,0 +1,16 @@
|
|||||||
|
package api
|
||||||
|
|
||||||
|
// Ptr returns a pointer to v. Useful for optional scalar fields where
|
||||||
|
// the wire format must distinguish absent (nil) from an explicit zero
|
||||||
|
// value (e.g. DisableNotification: api.Ptr(false) to override the
|
||||||
|
// chat default).
|
||||||
|
//
|
||||||
|
// For untyped literals, supply the type parameter explicitly:
|
||||||
|
//
|
||||||
|
// Limit: api.Ptr[int64](5)
|
||||||
|
//
|
||||||
|
// For already-typed values, type inference handles it:
|
||||||
|
//
|
||||||
|
// var n int64 = 5
|
||||||
|
// Limit: api.Ptr(n)
|
||||||
|
func Ptr[T any](v T) *T { return &v }
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package api_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/lukaszraczylo/go-telegram/api"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPtr(t *testing.T) {
|
||||||
|
if got := api.Ptr[int64](5); got == nil || *got != 5 {
|
||||||
|
t.Fatalf("Ptr[int64](5) = %v, want *5", got)
|
||||||
|
}
|
||||||
|
if got := api.Ptr(false); got == nil || *got != false {
|
||||||
|
t.Fatalf("Ptr(false) = %v, want *false", got)
|
||||||
|
}
|
||||||
|
if got := api.Ptr("hello"); got == nil || *got != "hello" {
|
||||||
|
t.Fatalf("Ptr(\"hello\") = %v, want *\"hello\"", got)
|
||||||
|
}
|
||||||
|
|
||||||
|
n := int64(42)
|
||||||
|
got := api.Ptr(n)
|
||||||
|
if got == nil || *got != 42 {
|
||||||
|
t.Fatalf("Ptr(n) = %v, want *42", got)
|
||||||
|
}
|
||||||
|
if got == &n {
|
||||||
|
t.Fatalf("Ptr should copy, not alias caller's variable")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -59,6 +59,7 @@ Package api contains the Telegram Bot API object types and method wrappers, gene
|
|||||||
- [func LogOut\(ctx context.Context, b \*client.Bot, p \*LogOutParams\) \(bool, error\)](<#LogOut>)
|
- [func LogOut\(ctx context.Context, b \*client.Bot, p \*LogOutParams\) \(bool, error\)](<#LogOut>)
|
||||||
- [func PinChatMessage\(ctx context.Context, b \*client.Bot, p \*PinChatMessageParams\) \(bool, error\)](<#PinChatMessage>)
|
- [func PinChatMessage\(ctx context.Context, b \*client.Bot, p \*PinChatMessageParams\) \(bool, error\)](<#PinChatMessage>)
|
||||||
- [func PromoteChatMember\(ctx context.Context, b \*client.Bot, p \*PromoteChatMemberParams\) \(bool, error\)](<#PromoteChatMember>)
|
- [func PromoteChatMember\(ctx context.Context, b \*client.Bot, p \*PromoteChatMemberParams\) \(bool, error\)](<#PromoteChatMember>)
|
||||||
|
- [func Ptr\[T any\]\(v T\) \*T](<#Ptr>)
|
||||||
- [func ReadBusinessMessage\(ctx context.Context, b \*client.Bot, p \*ReadBusinessMessageParams\) \(bool, error\)](<#ReadBusinessMessage>)
|
- [func ReadBusinessMessage\(ctx context.Context, b \*client.Bot, p \*ReadBusinessMessageParams\) \(bool, error\)](<#ReadBusinessMessage>)
|
||||||
- [func RefundStarPayment\(ctx context.Context, b \*client.Bot, p \*RefundStarPaymentParams\) \(bool, error\)](<#RefundStarPayment>)
|
- [func RefundStarPayment\(ctx context.Context, b \*client.Bot, p \*RefundStarPaymentParams\) \(bool, error\)](<#RefundStarPayment>)
|
||||||
- [func RemoveBusinessAccountProfilePhoto\(ctx context.Context, b \*client.Bot, p \*RemoveBusinessAccountProfilePhotoParams\) \(bool, error\)](<#RemoveBusinessAccountProfilePhoto>)
|
- [func RemoveBusinessAccountProfilePhoto\(ctx context.Context, b \*client.Bot, p \*RemoveBusinessAccountProfilePhotoParams\) \(bool, error\)](<#RemoveBusinessAccountProfilePhoto>)
|
||||||
@@ -1315,6 +1316,28 @@ PromoteChatMember calls the promoteChatMember Telegram Bot API method.
|
|||||||
|
|
||||||
Use this method to promote or demote a user in a supergroup or a channel. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Pass False for all boolean parameters to demote a user. Returns True on success.
|
Use this method to promote or demote a user in a supergroup or a channel. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Pass False for all boolean parameters to demote a user. Returns True on success.
|
||||||
|
|
||||||
|
<a name="Ptr"></a>
|
||||||
|
## func Ptr
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Ptr[T any](v T) *T
|
||||||
|
```
|
||||||
|
|
||||||
|
Ptr returns a pointer to v. Useful for optional scalar fields where the wire format must distinguish absent \(nil\) from an explicit zero value \(e.g. DisableNotification: api.Ptr\(false\) to override the chat default\).
|
||||||
|
|
||||||
|
For untyped literals, supply the type parameter explicitly:
|
||||||
|
|
||||||
|
```
|
||||||
|
Limit: api.Ptr[int64](5)
|
||||||
|
```
|
||||||
|
|
||||||
|
For already\-typed values, type inference handles it:
|
||||||
|
|
||||||
|
```
|
||||||
|
var n int64 = 5
|
||||||
|
Limit: api.Ptr(n)
|
||||||
|
```
|
||||||
|
|
||||||
<a name="ReadBusinessMessage"></a>
|
<a name="ReadBusinessMessage"></a>
|
||||||
## func ReadBusinessMessage
|
## func ReadBusinessMessage
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user