gleam-spacetraders-sdk/src/spacetraders_sdk/endpoints/accounts.gleam

71 lines
2.1 KiB
Gleam

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)
}
}