-module(ezconfig). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/ezconfig.gleam"). -export([get_config/1, get_rps/1, get_max_concurrent/1, list_domains/0, has_config/1]). -export_type([api_config/0]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. -type api_config() :: {api_config, integer(), integer(), binary()}. -file("src/ezconfig.gleam", 31). ?DOC( " Community-maintained API configurations\n" " Update this dict and publish a new version to add/modify APIs\n" ). -spec api_configs() -> gleam@dict:dict(binary(), api_config()). api_configs() -> maps:from_list( [{<<"api.openai.com"/utf8>>, {api_config, 60, 10, <<"Tier 1: 60 req/min = 1 req/sec, but bursts allowed"/utf8>>}}, {<<"api.anthropic.com"/utf8>>, {api_config, 50, 5, <<"Claude API rate limits"/utf8>>}}, {<<"api.stripe.com"/utf8>>, {api_config, 100, 20, <<"Stripe has high rate limits, can handle concurrent requests well"/utf8>>}}, {<<"api.github.com"/utf8>>, {api_config, 10, 3, <<"GitHub API: 5000 req/hour = ~1.4 req/sec, be conservative"/utf8>>}}, {<<"api.twitter.com"/utf8>>, {api_config, 15, 5, <<"Twitter API v2 rate limits vary by endpoint"/utf8>>}}, {<<"graph.facebook.com"/utf8>>, {api_config, 200, 10, <<"Facebook Graph API has high limits"/utf8>>}}, {<<"www.googleapis.com"/utf8>>, {api_config, 10, 5, <<"Google APIs vary widely, this is conservative default"/utf8>>}}, {<<"slack.com"/utf8>>, {api_config, 1, 1, <<"Slack webhooks: 1 req/sec tier limit"/utf8>>}}, {<<"discord.com"/utf8>>, {api_config, 50, 10, <<"Discord API has generous rate limits"/utf8>>}}, {<<"api.sendgrid.com"/utf8>>, {api_config, 10, 5, <<"SendGrid email API"/utf8>>}}, {<<"api.twilio.com"/utf8>>, {api_config, 20, 5, <<"Twilio messaging API"/utf8>>}}, {<<"api.hubspot.com"/utf8>>, {api_config, 10, 3, <<"HubSpot CRM API: 100 req/10sec = 10 req/sec"/utf8>>}}, {<<"api.notion.com"/utf8>>, {api_config, 3, 2, <<"Notion API: 3 req/sec rate limit"/utf8>>}}, {<<"api.airtable.com"/utf8>>, {api_config, 5, 2, <<"Airtable API: 5 req/sec rate limit"/utf8>>}}, {<<"shopify.com"/utf8>>, {api_config, 2, 2, <<"Shopify REST API: 2 req/sec (burst 40)"/utf8>>}}] ). -file("src/ezconfig.gleam", 105). ?DOC(" Get configuration for a specific API domain\n"). -spec get_config(binary()) -> gleam@option:option(api_config()). get_config(Domain) -> _pipe = gleam_stdlib:map_get(api_configs(), Domain), gleam@option:from_result(_pipe). -file("src/ezconfig.gleam", 110). ?DOC(" Get RPS for a domain, or None if not configured\n"). -spec get_rps(binary()) -> gleam@option:option(integer()). get_rps(Domain) -> case get_config(Domain) of {some, Config} -> {some, erlang:element(2, Config)}; none -> none end. -file("src/ezconfig.gleam", 118). ?DOC(" Get max_concurrent for a domain, or None if not configured\n"). -spec get_max_concurrent(binary()) -> gleam@option:option(integer()). get_max_concurrent(Domain) -> case get_config(Domain) of {some, Config} -> {some, erlang:element(3, Config)}; none -> none end. -file("src/ezconfig.gleam", 126). ?DOC(" Get all configured domains\n"). -spec list_domains() -> list(binary()). list_domains() -> maps:keys(api_configs()). -file("src/ezconfig.gleam", 131). ?DOC(" Check if a domain has a configuration\n"). -spec has_config(binary()) -> boolean(). has_config(Domain) -> case get_config(Domain) of {some, _} -> true; none -> false end.