import gleam/dynamic/decode import gleam/json import spacetraders_sdk/models/account.{type Account} import spacetraders_sdk/models/agent.{type Agent} import spacetraders_sdk/models/agent_symbol.{type AgentSymbol} import spacetraders_sdk/models/contract.{type Contract} import spacetraders_sdk/models/faction.{type Faction} import spacetraders_sdk/models/faction_symbol.{type FactionSymbol} import spacetraders_sdk/models/ship.{type Ship} import spacetraders_sdk/utils/api.{type ApiResponse} import spacetraders_sdk/utils/auth.{ type AccountToken, type AgentToken, AccountAuth, AgentAuth, } pub fn get_account(token: AgentToken) -> ApiResponse(Account) { let request = api.get(AgentAuth(token), "/my/account") use response <- api.try_send(request) case response.status { 200 -> api.parse_data_response( response, decode.field("account", account.decoder(), decode.success), ) _ -> api.parse_error_response(response) } } pub type AgentRegistered { AgentRegistered( token: AgentToken, agent: Agent, faction: Faction, contract: Contract, ships: List(Ship), ) } pub fn register_new_agent( token: AccountToken, agent_symbol: AgentSymbol, faction_symbol: FactionSymbol, ) -> ApiResponse(AgentRegistered) { let request = api.post_json( AccountAuth(token), "/register", json.object([ #("symbol", agent_symbol.encode(agent_symbol)), #("faction", faction_symbol.encode(faction_symbol)), ]), ) use response <- api.try_send(request) case response.status { 201 -> api.parse_data_response(response, { use token <- decode.field("token", auth.agent_token_decoder()) use agent <- decode.field("agent", agent.decoder()) use faction <- decode.field("faction", faction.decoder()) use contract <- decode.field("contract", contract.decoder()) use ships <- decode.field("ships", decode.list(ship.decoder())) decode.success(AgentRegistered( token:, agent:, faction:, contract:, ships:, )) }) _ -> api.parse_error_response(response) } }