package rudder import ( "net/http" "time" ) const DefaultBaseURL = "https://api.rudder.build" type Config struct { AdminKey string BaseURL string Timeout time.Duration HTTPClient *http.Client } type Client struct { Players *PlayersService Leaderboards *LeaderboardsService Wallet *WalletService Inventory *InventoryService Quests *QuestsService Storage *StorageService Metrics *MetricsService transport *transport } func New(config Config) (*Client, error) { if config.AdminKey == "" { return nil, &APIError{Code: ErrorCodeInvalidOptions, Message: "AdminKey is required"} } if config.BaseURL == "" { config.BaseURL = DefaultBaseURL } if config.Timeout == 0 { config.Timeout = 30 * time.Second } if config.HTTPClient == nil { config.HTTPClient = &http.Client{Timeout: config.Timeout} } transport := &transport{ baseURL: config.BaseURL, apiKey: config.AdminKey, httpClient: config.HTTPClient, } return &Client{ Players: &PlayersService{transport: transport}, Leaderboards: &LeaderboardsService{transport: transport}, Wallet: &WalletService{transport: transport}, Inventory: &InventoryService{transport: transport}, Quests: &QuestsService{transport: transport}, Storage: &StorageService{transport: transport}, Metrics: &MetricsService{transport: transport}, transport: transport, }, nil } func (c *Client) Player(playerID string) *PlayerHandle { return &PlayerHandle{ playerID: playerID, transport: c.transport, players: c.Players, wallet: c.Wallet, inventory: c.Inventory, quests: c.Quests, } } func (c *Client) Leaderboard(slug string) *LeaderboardHandle { return &LeaderboardHandle{ slug: slug, transport: c.transport, leaderboards: c.Leaderboards, } }