| |
|
|
| package openmeter |
|
|
| import ( |
| "fmt" |
| "net/http" |
| "net/url" |
| "strings" |
| ) |
|
|
| type Client struct { |
| baseURL *url.URL |
| httpClient *http.Client |
| token string |
| userAgent string |
| Events *EventsService |
| Meters *MetersService |
| Customers *CustomersService |
| Entitlements *EntitlementsService |
| Subscriptions *SubscriptionsService |
| Apps *AppsService |
| Billing *BillingService |
| Invoices *InvoicesService |
| Tax *TaxService |
| Currencies *CurrenciesService |
| Features *FeaturesService |
| LLMCost *LLMCostService |
| Plans *PlansService |
| Addons *AddonsService |
| PlanAddons *PlanAddonsService |
| Defaults *DefaultsService |
| Governance *GovernanceService |
| } |
|
|
| func New(baseURL string, opts ...Option) (*Client, error) { |
| if baseURL == "" { |
| return nil, fmt.Errorf("openmeter: baseURL is required") |
| } |
|
|
| u, err := url.Parse(baseURL) |
| if err != nil { |
| return nil, fmt.Errorf("openmeter: invalid baseURL %q: %w", baseURL, err) |
| } |
|
|
| if u.Scheme == "" || u.Host == "" { |
| return nil, fmt.Errorf("openmeter: baseURL %q must be absolute (scheme and host)", baseURL) |
| } |
|
|
| c := &Client{ |
| baseURL: u, |
| userAgent: defaultUserAgent, |
| } |
|
|
| for _, opt := range opts { |
| opt(c) |
| } |
|
|
| if c.httpClient == nil { |
| c.httpClient = defaultHTTPClient() |
| } |
|
|
| c.Events = &EventsService{client: c} |
| c.Meters = &MetersService{client: c} |
| c.Customers = &CustomersService{client: c} |
| c.Entitlements = &EntitlementsService{client: c} |
| c.Subscriptions = &SubscriptionsService{client: c} |
| c.Apps = &AppsService{client: c} |
| c.Billing = &BillingService{client: c} |
| c.Invoices = &InvoicesService{client: c} |
| c.Tax = &TaxService{client: c} |
| c.Currencies = &CurrenciesService{client: c} |
| c.Features = &FeaturesService{client: c} |
| c.LLMCost = &LLMCostService{client: c} |
| c.Plans = &PlansService{client: c} |
| c.Addons = &AddonsService{client: c} |
| c.PlanAddons = &PlanAddonsService{client: c} |
| c.Defaults = &DefaultsService{client: c} |
| c.Governance = &GovernanceService{client: c} |
| c.Customers.Billing = &CustomersBillingService{client: c} |
| c.Customers.Credits = &CustomersCreditsService{client: c} |
| c.Customers.Charges = &CustomersChargesService{client: c} |
| c.Customers.Credits.Grants = &CustomersCreditsGrantsService{client: c} |
| c.Customers.Credits.Balance = &CustomersCreditsBalanceService{client: c} |
| c.Customers.Credits.Adjustments = &CustomersCreditsAdjustmentsService{client: c} |
| c.Customers.Credits.Transactions = &CustomersCreditsTransactionsService{client: c} |
|
|
| return c, nil |
| } |
|
|
| |
| |
| |
| |
| |
| func (c *Client) resolve(apiPath string) *url.URL { |
| base := *c.baseURL |
|
|
| if !strings.HasSuffix(base.Path, "/") { |
| base.Path += "/" |
| } |
|
|
| trimmed := strings.TrimPrefix(apiPath, "/") |
| ref, err := url.Parse(trimmed) |
| if err != nil { |
| ref = &url.URL{Path: trimmed} |
| } |
|
|
| resolved := base.ResolveReference(ref) |
| resolved.RawQuery = base.RawQuery |
| return resolved |
| } |
|
|
| func replacePathParam(path, name, value string) string { |
| return strings.ReplaceAll(path, "{"+name+"}", url.PathEscape(value)) |
| } |
|
|