diff --git a/dev/spacetraders.openapi.json b/spacetraders.openapi.json similarity index 100% rename from dev/spacetraders.openapi.json rename to spacetraders.openapi.json diff --git a/src/spacetraders_sdk/endpoints/fleet.gleam b/src/spacetraders_api.gleam similarity index 56% rename from src/spacetraders_sdk/endpoints/fleet.gleam rename to src/spacetraders_api.gleam index 5a23f9b..b9c41ba 100644 --- a/src/spacetraders_sdk/endpoints/fleet.gleam +++ b/src/spacetraders_api.gleam @@ -1,44 +1,352 @@ +import birl.{type Time} +import gleam/dict.{type Dict} import gleam/dynamic/decode.{type Decoder} import gleam/json +import gleam/list import gleam/option.{type Option} -import spacetraders_sdk/models/agent.{type Agent} -import spacetraders_sdk/models/chart.{type Chart} -import spacetraders_sdk/models/chart_transaction.{type ChartTransaction} -import spacetraders_sdk/models/contract.{type Contract} -import spacetraders_sdk/models/cooldown.{type Cooldown} -import spacetraders_sdk/models/extraction.{type Extraction} -import spacetraders_sdk/models/market_transaction.{type MarketTransaction} -import spacetraders_sdk/models/module_symbol.{type ModuleSymbol} -import spacetraders_sdk/models/mount_symbol.{type MountSymbol} -import spacetraders_sdk/models/refinement_produce.{type RefinementProduce} -import spacetraders_sdk/models/refinement_yield.{type RefinementYield} -import spacetraders_sdk/models/repair_transaction.{type RepairTransaction} -import spacetraders_sdk/models/scanned_ship.{type ScannedShip} -import spacetraders_sdk/models/scanned_system.{type ScannedSystem} -import spacetraders_sdk/models/scanned_waypoint.{type ScannedWaypoint} -import spacetraders_sdk/models/scrap_transaction.{type ScrapTransaction} -import spacetraders_sdk/models/ship.{type Ship} -import spacetraders_sdk/models/ship_cargo.{type ShipCargo} -import spacetraders_sdk/models/ship_condition_event.{type ShipConditionEvent} -import spacetraders_sdk/models/ship_fuel.{type ShipFuel} -import spacetraders_sdk/models/ship_modification_transaction.{ +import gleam/uri.{type Uri} +import spacetraders_models/account.{type Account} +import spacetraders_models/agent.{type Agent} +import spacetraders_models/agent_event.{type AgentEvent} +import spacetraders_models/agent_symbol.{type AgentSymbol} +import spacetraders_models/chart.{type Chart} +import spacetraders_models/chart_transaction.{type ChartTransaction} +import spacetraders_models/construction.{type Construction} +import spacetraders_models/contract.{type Contract} +import spacetraders_models/contract_id.{type ContractId} +import spacetraders_models/cooldown.{type Cooldown} +import spacetraders_models/extraction.{type Extraction} +import spacetraders_models/faction.{type Faction} +import spacetraders_models/faction_symbol.{type FactionSymbol} +import spacetraders_models/jump_gate.{type JumpGate} +import spacetraders_models/market.{type Market} +import spacetraders_models/market_transaction.{type MarketTransaction} +import spacetraders_models/module_symbol.{type ModuleSymbol} +import spacetraders_models/mount_symbol.{type MountSymbol} +import spacetraders_models/public_agent.{type PublicAgent} +import spacetraders_models/refinement_produce.{type RefinementProduce} +import spacetraders_models/refinement_yield.{type RefinementYield} +import spacetraders_models/repair_transaction.{type RepairTransaction} +import spacetraders_models/scanned_ship.{type ScannedShip} +import spacetraders_models/scanned_system.{type ScannedSystem} +import spacetraders_models/scanned_waypoint.{type ScannedWaypoint} +import spacetraders_models/scrap_transaction.{type ScrapTransaction} +import spacetraders_models/ship.{type Ship} +import spacetraders_models/ship_cargo.{type ShipCargo} +import spacetraders_models/ship_condition_event.{type ShipConditionEvent} +import spacetraders_models/ship_fuel.{type ShipFuel} +import spacetraders_models/ship_modification_transaction.{ type ShipModificationTransaction, } -import spacetraders_sdk/models/ship_module.{type ShipModule} -import spacetraders_sdk/models/ship_mount.{type ShipMount} -import spacetraders_sdk/models/ship_nav.{type ShipNav} -import spacetraders_sdk/models/ship_nav_flight_mode.{type ShipNavFlightMode} -import spacetraders_sdk/models/ship_symbol.{type ShipSymbol} -import spacetraders_sdk/models/ship_type.{type ShipType} -import spacetraders_sdk/models/shipyard_transaction.{type ShipyardTransaction} -import spacetraders_sdk/models/siphon.{type Siphon} -import spacetraders_sdk/models/survey.{type Survey} -import spacetraders_sdk/models/trade_symbol.{type TradeSymbol} -import spacetraders_sdk/models/waypoint.{type Waypoint} -import spacetraders_sdk/models/waypoint_modifier.{type WaypointModifier} -import spacetraders_sdk/models/waypoint_symbol.{type WaypointSymbol} -import spacetraders_sdk/utils/api.{type ApiResponse, type PagedData} -import spacetraders_sdk/utils/auth.{type AgentToken, AgentAuth} +import spacetraders_models/ship_module.{type ShipModule} +import spacetraders_models/ship_mount.{type ShipMount} +import spacetraders_models/ship_nav.{type ShipNav} +import spacetraders_models/ship_nav_flight_mode.{type ShipNavFlightMode} +import spacetraders_models/ship_symbol.{type ShipSymbol} +import spacetraders_models/ship_type.{type ShipType} +import spacetraders_models/shipyard.{type Shipyard} +import spacetraders_models/shipyard_transaction.{type ShipyardTransaction} +import spacetraders_models/siphon.{type Siphon} +import spacetraders_models/survey.{type Survey} +import spacetraders_models/system.{type System} +import spacetraders_models/system_symbol.{type SystemSymbol} +import spacetraders_models/trade_symbol.{type TradeSymbol} +import spacetraders_models/waypoint.{type Waypoint} +import spacetraders_models/waypoint_modifier.{type WaypointModifier} +import spacetraders_models/waypoint_symbol.{type WaypointSymbol} +import spacetraders_models/waypoint_trait_symbol.{type WaypointTraitSymbol} +import spacetraders_models/waypoint_type.{type WaypointType} +import spacetraders_sdk/internal/api.{ + type AccountToken, type AgentToken, type ApiResponse, type PagedData, + AccountAuth, AgentAuth, NoAuth, +} +import spacetraders_sdk/internal/time + +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", api.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) + } +} + +pub fn list_public_agents( + page: Option(Int), + limit: Option(Int), +) -> ApiResponse(PagedData(List(PublicAgent))) { + let request = api.get_page(NoAuth, "/agents", page, limit) + use response <- api.try_send(request) + case response.status { + 200 -> + api.parse_paged_data_response( + response, + decode.list(public_agent.decoder()), + ) + _ -> api.parse_error_response(response) + } +} + +pub fn get_public_agent(agent_symbol: AgentSymbol) -> ApiResponse(PublicAgent) { + let request = + api.get(NoAuth, "/agents/" <> agent_symbol.to_string(agent_symbol)) + use response <- api.try_send(request) + case response.status { + 200 -> api.parse_data_response(response, public_agent.decoder()) + _ -> api.parse_error_response(response) + } +} + +pub fn get_agent(token: AgentToken) -> ApiResponse(Agent) { + let request = api.get(AgentAuth(token), "/my/agent") + use response <- api.try_send(request) + case response.status { + 200 -> api.parse_data_response(response, agent.decoder()) + _ -> api.parse_error_response(response) + } +} + +pub fn get_agent_events(token: AgentToken) -> ApiResponse(List(AgentEvent)) { + let request = api.get(AgentAuth(token), "/my/agent/events") + use response <- api.try_send(request) + case response.status { + 200 -> api.parse_data_response(response, decode.list(agent_event.decoder())) + _ -> api.parse_error_response(response) + } +} + +pub fn list_contracts( + token: AgentToken, + page: Option(Int), + limit: Option(Int), +) -> ApiResponse(PagedData(List(Contract))) { + let request = api.get_page(AgentAuth(token), "/my/contracts", page, limit) + use response <- api.try_send(request) + case response.status { + 200 -> + api.parse_paged_data_response(response, decode.list(contract.decoder())) + _ -> api.parse_error_response(response) + } +} + +pub fn get_contract( + token: AgentToken, + contract_id: ContractId, +) -> ApiResponse(Contract) { + let request = + api.get( + AgentAuth(token), + "/my/contracts/" <> contract_id.to_string(contract_id), + ) + use response <- api.try_send(request) + case response.status { + 200 -> api.parse_data_response(response, contract.decoder()) + _ -> api.parse_error_response(response) + } +} + +pub type ContractAccepted { + ContractAccepted(contract: Contract, agent: Agent) +} + +pub fn accept_contract( + token: AgentToken, + contract_id: ContractId, +) -> ApiResponse(ContractAccepted) { + let request = + api.post( + AgentAuth(token), + "/my/contracts/" <> contract_id.to_string(contract_id) <> "/accept", + ) + use response <- api.try_send(request) + case response.status { + 200 -> + api.parse_data_response(response, { + use contract <- decode.field("contract", contract.decoder()) + use agent <- decode.field("agent", agent.decoder()) + decode.success(ContractAccepted(contract:, agent:)) + }) + _ -> api.parse_error_response(response) + } +} + +pub type ContractFulfilled { + ContractFulfilled(contract: Contract, agent: Agent) +} + +pub fn fulfill_contract( + token: AgentToken, + contract_id: ContractId, +) -> ApiResponse(ContractFulfilled) { + let request = + api.post( + AgentAuth(token), + "/my/contracts/" <> contract_id.to_string(contract_id) <> "/fulfill", + ) + use response <- api.try_send(request) + case response.status { + 200 -> + api.parse_data_response(response, { + use contract <- decode.field("contract", contract.decoder()) + use agent <- decode.field("agent", agent.decoder()) + decode.success(ContractFulfilled(contract:, agent:)) + }) + _ -> api.parse_error_response(response) + } +} + +pub type ContractCargoDelivered { + ContractCargoDelivered(contract: Contract, cargo: ShipCargo) +} + +pub fn deliver_contract_cargo( + token: AgentToken, + contract_id: ContractId, + ship_symbol: ShipSymbol, + trade_symbol: TradeSymbol, + units: Int, +) -> ApiResponse(ContractCargoDelivered) { + let request = + api.post_json( + AgentAuth(token), + "/my/contracts/" <> contract_id.to_string(contract_id) <> "/deliver", + json.object([ + #("shipSymbol", ship_symbol.encode(ship_symbol)), + #("tradeSymbol", trade_symbol.encode(trade_symbol)), + #("units", json.int(units)), + ]), + ) + use response <- api.try_send(request) + case response.status { + 200 -> + api.parse_data_response(response, { + use contract <- decode.field("contract", contract.decoder()) + use cargo <- decode.field("cargo", ship_cargo.decoder()) + decode.success(ContractCargoDelivered(contract:, cargo:)) + }) + _ -> api.parse_error_response(response) + } +} + +pub type ExportToImportMap = + Dict(TradeSymbol, List(TradeSymbol)) + +pub fn get_supply_chain() -> ApiResponse(ExportToImportMap) { + let request = api.get(NoAuth, "/market/supply-chain") + use response <- api.try_send(request) + case response.status { + 200 -> + api.parse_data_response( + response, + decode.field( + "exportToImportMap", + decode.dict( + trade_symbol.decoder(), + decode.list(trade_symbol.decoder()), + ), + decode.success, + ), + ) + _ -> api.parse_error_response(response) + } +} + +pub fn list_factions( + page: Option(Int), + limit: Option(Int), +) -> ApiResponse(PagedData(List(Faction))) { + let request = api.get_page(NoAuth, "/factions", page, limit) + use response <- api.try_send(request) + case response.status { + 200 -> + api.parse_paged_data_response(response, decode.list(faction.decoder())) + _ -> api.parse_error_response(response) + } +} + +pub fn get_faction(symbol: FactionSymbol) -> ApiResponse(Faction) { + let request = + api.get(NoAuth, "/factions/" <> faction_symbol.to_string(symbol)) + use response <- api.try_send(request) + case response.status { + 200 -> api.parse_data_response(response, faction.decoder()) + _ -> api.parse_error_response(response) + } +} + +pub type FactionReputation { + FactionReputation(symbol: FactionSymbol, reputation: Int) +} + +pub fn get_my_factions( + token: AgentToken, + page: Option(Int), + limit: Option(Int), +) -> ApiResponse(PagedData(List(FactionReputation))) { + let request = api.get_page(AgentAuth(token), "/my/factions", page, limit) + use response <- api.try_send(request) + case response.status { + 200 -> + api.parse_paged_data_response( + response, + decode.list({ + use symbol <- decode.field("symbol", faction_symbol.decoder()) + use reputation <- decode.field("reputation", decode.int) + decode.success(FactionReputation(symbol:, reputation:)) + }), + ) + _ -> api.parse_error_response(response) + } +} pub fn list_ships( token: AgentToken, @@ -1072,3 +1380,383 @@ pub fn patch_ship_nav( _ -> api.parse_error_response(response) } } + +pub type Stats { + Stats( + accounts: Option(Int), + agents: Int, + ships: Int, + systems: Int, + waypoints: Int, + ) +} + +fn stats_decoder() -> Decoder(Stats) { + use accounts <- decode.optional_field( + "accounts", + option.None, + decode.optional(decode.int), + ) + use agents <- decode.field("agents", decode.int) + use ships <- decode.field("ships", decode.int) + use systems <- decode.field("systems", decode.int) + use waypoints <- decode.field("waypoints", decode.int) + decode.success(Stats(accounts:, agents:, ships:, systems:, waypoints:)) +} + +pub type Health { + Health(last_market_update: Option(Time)) +} + +fn health_decoder() -> Decoder(Health) { + use last_market_update <- decode.optional_field( + "lastMarketUpdate", + option.None, + decode.optional(time.datetime_decoder()), + ) + decode.success(Health(last_market_update:)) +} + +pub type CreditLeaderboardEntry { + CreditLeaderboardEntry(agent_symbol: AgentSymbol, credits: Int) +} + +fn credit_leaderboard_entry_decoder() -> Decoder(CreditLeaderboardEntry) { + use agent_symbol <- decode.field("agentSymbol", agent_symbol.decoder()) + use credits <- decode.field("credits", decode.int) + decode.success(CreditLeaderboardEntry(agent_symbol:, credits:)) +} + +pub type ChartLeaderboardEntry { + ChartLeaderboardEntry(agent_symbol: AgentSymbol, chart_count: Int) +} + +fn chart_leaderboard_entry_decoder() -> Decoder(ChartLeaderboardEntry) { + use agent_symbol <- decode.field("agentSymbol", agent_symbol.decoder()) + use chart_count <- decode.field("chartCount", decode.int) + decode.success(ChartLeaderboardEntry(agent_symbol:, chart_count:)) +} + +pub type Leaderboards { + Leaderboards( + most_credits: List(CreditLeaderboardEntry), + most_submitted_charts: List(ChartLeaderboardEntry), + ) +} + +fn leaderboards_decoder() -> Decoder(Leaderboards) { + use most_credits <- decode.field( + "mostCredits", + decode.list(credit_leaderboard_entry_decoder()), + ) + use most_submitted_charts <- decode.field( + "mostSubmittedCharts", + decode.list(chart_leaderboard_entry_decoder()), + ) + decode.success(Leaderboards(most_credits:, most_submitted_charts:)) +} + +pub type ServerResets { + ServerResets(next: Time, frequency: String) +} + +fn server_resets_decoder() -> Decoder(ServerResets) { + use next <- decode.field("next", time.datetime_decoder()) + use frequency <- decode.field("frequency", decode.string) + decode.success(ServerResets(next:, frequency:)) +} + +pub type Announcement { + Announcement(title: String, body: String) +} + +fn announcement_decoder() -> Decoder(Announcement) { + use title <- decode.field("title", decode.string) + use body <- decode.field("body", decode.string) + decode.success(Announcement(title:, body:)) +} + +pub type Link { + Link(name: String, url: Uri) +} + +fn link_decoder() -> Decoder(Link) { + use name <- decode.field("name", decode.string) + use url <- decode.field("url", { + use value <- decode.then(decode.string) + case uri.parse(value) { + Ok(time) -> decode.success(time) + Error(Nil) -> decode.failure(uri.empty, "Uri") + } + }) + decode.success(Link(name:, url:)) +} + +pub type ServerStatus { + ServerStatus( + status: String, + version: String, + reset_date: Time, + description: String, + stats: Stats, + health: Health, + leaderboards: Leaderboards, + server_resets: ServerResets, + announcements: List(Announcement), + links: List(Link), + ) +} + +fn server_status_decoder() -> Decoder(ServerStatus) { + use status <- decode.field("status", decode.string) + use version <- decode.field("version", decode.string) + use reset_date <- decode.field("resetDate", time.date_decoder()) + use description <- decode.field("description", decode.string) + use stats <- decode.field("stats", stats_decoder()) + use health <- decode.field("health", health_decoder()) + use leaderboards <- decode.field("leaderboards", leaderboards_decoder()) + use server_resets <- decode.field("serverResets", server_resets_decoder()) + use announcements <- decode.field( + "announcements", + decode.list(announcement_decoder()), + ) + use links <- decode.field("links", decode.list(link_decoder())) + decode.success(ServerStatus( + status:, + version:, + reset_date:, + description:, + stats:, + health:, + leaderboards:, + server_resets:, + announcements:, + links:, + )) +} + +pub fn get_server_status() -> ApiResponse(ServerStatus) { + let request = api.get(NoAuth, "/") + use response <- api.try_send(request) + case response.status { + 200 -> api.parse_response(response, server_status_decoder()) + _ -> api.parse_error_response(response) + } +} + +pub type ErrorCode { + ErrorCode(code: Int, name: String) +} + +fn error_code_decoder() -> Decoder(ErrorCode) { + use code <- decode.field("code", decode.int) + use name <- decode.field("name", decode.string) + decode.success(ErrorCode(code:, name:)) +} + +pub fn list_error_codes() -> ApiResponse(List(ErrorCode)) { + let request = api.get(NoAuth, "/error-codes") + use response <- api.try_send(request) + case response.status { + 200 -> + api.parse_response( + response, + decode.field( + "errorCodes", + decode.list(error_code_decoder()), + decode.success, + ), + ) + _ -> api.parse_error_response(response) + } +} + +pub fn list_systems( + page: Option(Int), + limit: Option(Int), +) -> ApiResponse(PagedData(List(System))) { + let request = api.get_page(NoAuth, "/systems", page, limit) + use response <- api.try_send(request) + case response.status { + 200 -> + api.parse_paged_data_response(response, decode.list(system.decoder())) + _ -> api.parse_error_response(response) + } +} + +pub fn get_system(system_symbol: SystemSymbol) -> ApiResponse(System) { + let request = + api.get(NoAuth, "/systems/" <> system_symbol.to_string(system_symbol)) + use response <- api.try_send(request) + case response.status { + 200 -> api.parse_data_response(response, system.decoder()) + _ -> api.parse_error_response(response) + } +} + +pub fn list_system_waypoints( + system_symbol: SystemSymbol, + page: Option(Int), + limit: Option(Int), + type_: Option(WaypointType), + traits: List(WaypointTraitSymbol), +) -> ApiResponse(PagedData(List(Waypoint))) { + let query = + list.map(traits, fn(trait) { + #("traits", waypoint_trait_symbol.to_string(trait)) + }) + let query = case type_ { + option.Some(type_) -> [#("type", waypoint_type.to_string(type_)), ..query] + option.None -> query + } + let request = + api.get_page_with_query( + NoAuth, + "/systems/" <> system_symbol.to_string(system_symbol) <> "/waypoints", + page, + limit, + query, + ) + use response <- api.try_send(request) + case response.status { + 200 -> + api.parse_paged_data_response(response, decode.list(waypoint.decoder())) + _ -> api.parse_error_response(response) + } +} + +pub fn get_waypoint( + system_symbol: SystemSymbol, + waypoint_symbol: WaypointSymbol, +) -> ApiResponse(Waypoint) { + let request = + api.get( + NoAuth, + "/systems/" + <> system_symbol.to_string(system_symbol) + <> "/waypoints/" + <> waypoint_symbol.to_string(waypoint_symbol), + ) + use response <- api.try_send(request) + case response.status { + 200 -> api.parse_data_response(response, waypoint.decoder()) + _ -> api.parse_error_response(response) + } +} + +pub fn get_construction_site( + system_symbol: SystemSymbol, + waypoint_symbol: WaypointSymbol, +) -> ApiResponse(Construction) { + let request = + api.get( + NoAuth, + "/systems/" + <> system_symbol.to_string(system_symbol) + <> "/waypoints/" + <> waypoint_symbol.to_string(waypoint_symbol) + <> "/construction", + ) + use response <- api.try_send(request) + case response.status { + 200 -> api.parse_data_response(response, construction.decoder()) + _ -> api.parse_error_response(response) + } +} + +pub type ConstructionSiteSupplied { + ConstructionSiteSupplied(construction: Construction, cargo: ShipCargo) +} + +pub fn supply_construction_site( + system_symbol: SystemSymbol, + waypoint_symbol: WaypointSymbol, + ship_symbol: ShipSymbol, + trade_symbol: TradeSymbol, + units: Int, +) -> ApiResponse(ConstructionSiteSupplied) { + let request = + api.post_json( + NoAuth, + "/systems/" + <> system_symbol.to_string(system_symbol) + <> "/waypoints/" + <> waypoint_symbol.to_string(waypoint_symbol) + <> "/construction/supply", + json.object([ + #("shipSymbol", ship_symbol.encode(ship_symbol)), + #("tradeSymbol", trade_symbol.encode(trade_symbol)), + #("units", json.int(units)), + ]), + ) + use response <- api.try_send(request) + case response.status { + 201 -> + api.parse_data_response(response, { + use construction <- decode.field("construction", construction.decoder()) + use cargo <- decode.field("cargo", ship_cargo.decoder()) + decode.success(ConstructionSiteSupplied(construction:, cargo:)) + }) + _ -> api.parse_error_response(response) + } +} + +pub fn get_market( + system_symbol: SystemSymbol, + waypoint_symbol: WaypointSymbol, +) -> ApiResponse(Market) { + let request = + api.get( + NoAuth, + "/systems/" + <> system_symbol.to_string(system_symbol) + <> "/waypoints/" + <> waypoint_symbol.to_string(waypoint_symbol) + <> "/market", + ) + use response <- api.try_send(request) + case response.status { + 200 -> api.parse_data_response(response, market.decoder()) + _ -> api.parse_error_response(response) + } +} + +pub fn get_jump_gate( + system_symbol: SystemSymbol, + waypoint_symbol: WaypointSymbol, +) -> ApiResponse(JumpGate) { + let request = + api.get( + NoAuth, + "/systems/" + <> system_symbol.to_string(system_symbol) + <> "/waypoints/" + <> waypoint_symbol.to_string(waypoint_symbol) + <> "/jump-gate", + ) + use response <- api.try_send(request) + case response.status { + 200 -> api.parse_data_response(response, jump_gate.decoder()) + _ -> api.parse_error_response(response) + } +} + +pub fn get_shipyard( + system_symbol: SystemSymbol, + waypoint_symbol: WaypointSymbol, +) -> ApiResponse(Shipyard) { + let request = + api.get( + NoAuth, + "/systems/" + <> system_symbol.to_string(system_symbol) + <> "/waypoints/" + <> waypoint_symbol.to_string(waypoint_symbol) + <> "/shipyard", + ) + use response <- api.try_send(request) + case response.status { + 200 -> api.parse_data_response(response, shipyard.decoder()) + _ -> api.parse_error_response(response) + } +} diff --git a/src/spacetraders_sdk/models/account.gleam b/src/spacetraders_models/account.gleam similarity index 78% rename from src/spacetraders_sdk/models/account.gleam rename to src/spacetraders_models/account.gleam index c42c15e..82db3f5 100644 --- a/src/spacetraders_sdk/models/account.gleam +++ b/src/spacetraders_models/account.gleam @@ -1,8 +1,8 @@ import birl.{type Time} import gleam/dynamic/decode.{type Decoder} import gleam/option.{type Option} -import spacetraders_sdk/models/account_id.{type AccountId} -import spacetraders_sdk/utils/api +import spacetraders_models/account_id.{type AccountId} +import spacetraders_sdk/internal/time pub type Account { Account( @@ -25,6 +25,6 @@ pub fn decoder() -> Decoder(Account) { option.None, decode.optional(decode.string), ) - use created_at <- decode.field("createdAt", api.time_decoder()) + use created_at <- decode.field("createdAt", time.datetime_decoder()) decode.success(Account(id:, email:, token:, created_at:)) } diff --git a/src/spacetraders_sdk/models/account_id.gleam b/src/spacetraders_models/account_id.gleam similarity index 100% rename from src/spacetraders_sdk/models/account_id.gleam rename to src/spacetraders_models/account_id.gleam diff --git a/src/spacetraders_sdk/models/activity_level.gleam b/src/spacetraders_models/activity_level.gleam similarity index 100% rename from src/spacetraders_sdk/models/activity_level.gleam rename to src/spacetraders_models/activity_level.gleam diff --git a/src/spacetraders_sdk/models/agent.gleam b/src/spacetraders_models/agent.gleam similarity index 76% rename from src/spacetraders_sdk/models/agent.gleam rename to src/spacetraders_models/agent.gleam index f0dae5c..fbe363b 100644 --- a/src/spacetraders_sdk/models/agent.gleam +++ b/src/spacetraders_models/agent.gleam @@ -1,8 +1,8 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/account_id.{type AccountId} -import spacetraders_sdk/models/agent_symbol.{type AgentSymbol} -import spacetraders_sdk/models/faction_symbol.{type FactionSymbol} -import spacetraders_sdk/models/waypoint_symbol.{type WaypointSymbol} +import spacetraders_models/account_id.{type AccountId} +import spacetraders_models/agent_symbol.{type AgentSymbol} +import spacetraders_models/faction_symbol.{type FactionSymbol} +import spacetraders_models/waypoint_symbol.{type WaypointSymbol} pub type Agent { Agent( diff --git a/src/spacetraders_sdk/models/agent_event.gleam b/src/spacetraders_models/agent_event.gleam similarity index 79% rename from src/spacetraders_sdk/models/agent_event.gleam rename to src/spacetraders_models/agent_event.gleam index 858e893..5a0fae7 100644 --- a/src/spacetraders_sdk/models/agent_event.gleam +++ b/src/spacetraders_models/agent_event.gleam @@ -2,8 +2,8 @@ import birl.{type Time} import gleam/dynamic.{type Dynamic} import gleam/dynamic/decode.{type Decoder} import gleam/option.{type Option} -import spacetraders_sdk/models/agent_event_id.{type AgentEventId} -import spacetraders_sdk/utils/api +import spacetraders_models/agent_event_id.{type AgentEventId} +import spacetraders_sdk/internal/time pub type AgentEvent { AgentEvent( @@ -24,6 +24,6 @@ pub fn decoder() -> Decoder(AgentEvent) { option.None, decode.optional(decode.dynamic), ) - use created_at <- decode.field("createdAt", api.time_decoder()) + use created_at <- decode.field("createdAt", time.datetime_decoder()) decode.success(AgentEvent(id:, type_:, message:, data:, created_at:)) } diff --git a/src/spacetraders_sdk/models/agent_event_id.gleam b/src/spacetraders_models/agent_event_id.gleam similarity index 100% rename from src/spacetraders_sdk/models/agent_event_id.gleam rename to src/spacetraders_models/agent_event_id.gleam diff --git a/src/spacetraders_sdk/models/agent_symbol.gleam b/src/spacetraders_models/agent_symbol.gleam similarity index 100% rename from src/spacetraders_sdk/models/agent_symbol.gleam rename to src/spacetraders_models/agent_symbol.gleam diff --git a/src/spacetraders_sdk/models/chart.gleam b/src/spacetraders_models/chart.gleam similarity index 66% rename from src/spacetraders_sdk/models/chart.gleam rename to src/spacetraders_models/chart.gleam index ea312ff..a5326b2 100644 --- a/src/spacetraders_sdk/models/chart.gleam +++ b/src/spacetraders_models/chart.gleam @@ -1,8 +1,8 @@ import birl.{type Time} import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/agent_symbol.{type AgentSymbol} -import spacetraders_sdk/models/waypoint_symbol.{type WaypointSymbol} -import spacetraders_sdk/utils/api +import spacetraders_models/agent_symbol.{type AgentSymbol} +import spacetraders_models/waypoint_symbol.{type WaypointSymbol} +import spacetraders_sdk/internal/time pub type Chart { Chart( @@ -18,6 +18,6 @@ pub fn decoder() -> Decoder(Chart) { waypoint_symbol.decoder(), ) use submitted_by <- decode.field("submittedBy", agent_symbol.decoder()) - use submitted_on <- decode.field("submittedOn", api.time_decoder()) + use submitted_on <- decode.field("submittedOn", time.datetime_decoder()) decode.success(Chart(waypoint_symbol:, submitted_by:, submitted_on:)) } diff --git a/src/spacetraders_sdk/models/chart_transaction.gleam b/src/spacetraders_models/chart_transaction.gleam similarity index 73% rename from src/spacetraders_sdk/models/chart_transaction.gleam rename to src/spacetraders_models/chart_transaction.gleam index b691be0..2851eb4 100644 --- a/src/spacetraders_sdk/models/chart_transaction.gleam +++ b/src/spacetraders_models/chart_transaction.gleam @@ -1,8 +1,8 @@ import birl.{type Time} import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/ship_symbol.{type ShipSymbol} -import spacetraders_sdk/models/waypoint_symbol.{type WaypointSymbol} -import spacetraders_sdk/utils/api +import spacetraders_models/ship_symbol.{type ShipSymbol} +import spacetraders_models/waypoint_symbol.{type WaypointSymbol} +import spacetraders_sdk/internal/time pub type ChartTransaction { ChartTransaction( @@ -20,7 +20,7 @@ pub fn decoder() -> Decoder(ChartTransaction) { ) use ship_symbol <- decode.field("shipSymbol", ship_symbol.decoder()) use total_price <- decode.field("totalPrice", decode.int) - use timestamp <- decode.field("timestamp", api.time_decoder()) + use timestamp <- decode.field("timestamp", time.datetime_decoder()) decode.success(ChartTransaction( waypoint_symbol:, ship_symbol:, diff --git a/src/spacetraders_sdk/models/constellation.gleam b/src/spacetraders_models/constellation.gleam similarity index 100% rename from src/spacetraders_sdk/models/constellation.gleam rename to src/spacetraders_models/constellation.gleam diff --git a/src/spacetraders_sdk/models/construction.gleam b/src/spacetraders_models/construction.gleam similarity index 77% rename from src/spacetraders_sdk/models/construction.gleam rename to src/spacetraders_models/construction.gleam index cb1d328..6381c34 100644 --- a/src/spacetraders_sdk/models/construction.gleam +++ b/src/spacetraders_models/construction.gleam @@ -1,6 +1,6 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/construction_material.{type ConstructionMaterial} -import spacetraders_sdk/models/waypoint_symbol.{type WaypointSymbol} +import spacetraders_models/construction_material.{type ConstructionMaterial} +import spacetraders_models/waypoint_symbol.{type WaypointSymbol} pub type Construction { Construction( diff --git a/src/spacetraders_sdk/models/construction_material.gleam b/src/spacetraders_models/construction_material.gleam similarity index 88% rename from src/spacetraders_sdk/models/construction_material.gleam rename to src/spacetraders_models/construction_material.gleam index ad30dfb..b109204 100644 --- a/src/spacetraders_sdk/models/construction_material.gleam +++ b/src/spacetraders_models/construction_material.gleam @@ -1,5 +1,5 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/trade_symbol.{type TradeSymbol} +import spacetraders_models/trade_symbol.{type TradeSymbol} pub type ConstructionMaterial { ConstructionMaterial(trade_symbol: TradeSymbol, required: Int, fulfilled: Int) diff --git a/src/spacetraders_sdk/models/contract.gleam b/src/spacetraders_models/contract.gleam similarity index 74% rename from src/spacetraders_sdk/models/contract.gleam rename to src/spacetraders_models/contract.gleam index 35d9b67..8a537e9 100644 --- a/src/spacetraders_sdk/models/contract.gleam +++ b/src/spacetraders_models/contract.gleam @@ -1,11 +1,11 @@ import birl.{type Time} import gleam/dynamic/decode.{type Decoder} import gleam/option.{type Option} -import spacetraders_sdk/models/contract_id.{type ContractId} -import spacetraders_sdk/models/contract_terms.{type ContractTerms} -import spacetraders_sdk/models/contract_type.{type ContractType} -import spacetraders_sdk/models/faction_symbol.{type FactionSymbol} -import spacetraders_sdk/utils/api +import spacetraders_models/contract_id.{type ContractId} +import spacetraders_models/contract_terms.{type ContractTerms} +import spacetraders_models/contract_type.{type ContractType} +import spacetraders_models/faction_symbol.{type FactionSymbol} +import spacetraders_sdk/internal/time pub type Contract { Contract( @@ -29,7 +29,7 @@ pub fn decoder() -> Decoder(Contract) { use deadline_to_accept <- decode.optional_field( "deadlineToAccept", option.None, - decode.optional(api.time_decoder()), + decode.optional(time.datetime_decoder()), ) decode.success(Contract( id:, diff --git a/src/spacetraders_sdk/models/contract_deliver_good.gleam b/src/spacetraders_models/contract_deliver_good.gleam similarity index 84% rename from src/spacetraders_sdk/models/contract_deliver_good.gleam rename to src/spacetraders_models/contract_deliver_good.gleam index 1c790af..b0d27bb 100644 --- a/src/spacetraders_sdk/models/contract_deliver_good.gleam +++ b/src/spacetraders_models/contract_deliver_good.gleam @@ -1,6 +1,6 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/trade_symbol.{type TradeSymbol} -import spacetraders_sdk/models/waypoint_symbol.{type WaypointSymbol} +import spacetraders_models/trade_symbol.{type TradeSymbol} +import spacetraders_models/waypoint_symbol.{type WaypointSymbol} pub type ContractDeliverGood { ContractDeliverGood( diff --git a/src/spacetraders_sdk/models/contract_id.gleam b/src/spacetraders_models/contract_id.gleam similarity index 100% rename from src/spacetraders_sdk/models/contract_id.gleam rename to src/spacetraders_models/contract_id.gleam diff --git a/src/spacetraders_sdk/models/contract_payment.gleam b/src/spacetraders_models/contract_payment.gleam similarity index 100% rename from src/spacetraders_sdk/models/contract_payment.gleam rename to src/spacetraders_models/contract_payment.gleam diff --git a/src/spacetraders_sdk/models/contract_terms.gleam b/src/spacetraders_models/contract_terms.gleam similarity index 69% rename from src/spacetraders_sdk/models/contract_terms.gleam rename to src/spacetraders_models/contract_terms.gleam index f618336..202ceb6 100644 --- a/src/spacetraders_sdk/models/contract_terms.gleam +++ b/src/spacetraders_models/contract_terms.gleam @@ -1,9 +1,9 @@ import birl.{type Time} import gleam/dynamic/decode.{type Decoder} import gleam/option.{type Option} -import spacetraders_sdk/models/contract_deliver_good.{type ContractDeliverGood} -import spacetraders_sdk/models/contract_payment.{type ContractPayment} -import spacetraders_sdk/utils/api +import spacetraders_models/contract_deliver_good.{type ContractDeliverGood} +import spacetraders_models/contract_payment.{type ContractPayment} +import spacetraders_sdk/internal/time pub type ContractTerms { ContractTerms( @@ -14,7 +14,7 @@ pub type ContractTerms { } pub fn decoder() -> Decoder(ContractTerms) { - use deadline <- decode.field("deadline", api.time_decoder()) + use deadline <- decode.field("deadline", time.datetime_decoder()) use payment <- decode.field("payment", contract_payment.decoder()) use deliver <- decode.optional_field( "deliver", diff --git a/src/spacetraders_sdk/models/contract_type.gleam b/src/spacetraders_models/contract_type.gleam similarity index 100% rename from src/spacetraders_sdk/models/contract_type.gleam rename to src/spacetraders_models/contract_type.gleam diff --git a/src/spacetraders_sdk/models/cooldown.gleam b/src/spacetraders_models/cooldown.gleam similarity index 83% rename from src/spacetraders_sdk/models/cooldown.gleam rename to src/spacetraders_models/cooldown.gleam index b2940b8..fb510f5 100644 --- a/src/spacetraders_sdk/models/cooldown.gleam +++ b/src/spacetraders_models/cooldown.gleam @@ -1,8 +1,8 @@ import birl.{type Time} import gleam/dynamic/decode.{type Decoder} import gleam/option.{type Option} -import spacetraders_sdk/models/ship_symbol.{type ShipSymbol} -import spacetraders_sdk/utils/api +import spacetraders_models/ship_symbol.{type ShipSymbol} +import spacetraders_sdk/internal/time pub type Cooldown { Cooldown( @@ -20,7 +20,7 @@ pub fn decoder() -> Decoder(Cooldown) { use expiration <- decode.optional_field( "expiration", option.None, - decode.optional(api.time_decoder()), + decode.optional(time.datetime_decoder()), ) decode.success(Cooldown( ship_symbol:, diff --git a/src/spacetraders_sdk/models/crew_rotation.gleam b/src/spacetraders_models/crew_rotation.gleam similarity index 100% rename from src/spacetraders_sdk/models/crew_rotation.gleam rename to src/spacetraders_models/crew_rotation.gleam diff --git a/src/spacetraders_sdk/models/engine_symbol.gleam b/src/spacetraders_models/engine_symbol.gleam similarity index 100% rename from src/spacetraders_sdk/models/engine_symbol.gleam rename to src/spacetraders_models/engine_symbol.gleam diff --git a/src/spacetraders_sdk/models/extraction.gleam b/src/spacetraders_models/extraction.gleam similarity index 73% rename from src/spacetraders_sdk/models/extraction.gleam rename to src/spacetraders_models/extraction.gleam index 59d6806..793ba23 100644 --- a/src/spacetraders_sdk/models/extraction.gleam +++ b/src/spacetraders_models/extraction.gleam @@ -1,6 +1,6 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/extraction_yield.{type ExtractionYield} -import spacetraders_sdk/models/ship_symbol.{type ShipSymbol} +import spacetraders_models/extraction_yield.{type ExtractionYield} +import spacetraders_models/ship_symbol.{type ShipSymbol} pub type Extraction { Extraction(ship_symbol: ShipSymbol, yield: ExtractionYield) diff --git a/src/spacetraders_sdk/models/extraction_yield.gleam b/src/spacetraders_models/extraction_yield.gleam similarity index 84% rename from src/spacetraders_sdk/models/extraction_yield.gleam rename to src/spacetraders_models/extraction_yield.gleam index ea8e0c6..0b84e1a 100644 --- a/src/spacetraders_sdk/models/extraction_yield.gleam +++ b/src/spacetraders_models/extraction_yield.gleam @@ -1,5 +1,5 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/trade_symbol.{type TradeSymbol} +import spacetraders_models/trade_symbol.{type TradeSymbol} pub type ExtractionYield { ExtractionYield(symbol: TradeSymbol, units: Int) diff --git a/src/spacetraders_sdk/models/faction.gleam b/src/spacetraders_models/faction.gleam similarity index 81% rename from src/spacetraders_sdk/models/faction.gleam rename to src/spacetraders_models/faction.gleam index 6ba33da..b2f2724 100644 --- a/src/spacetraders_sdk/models/faction.gleam +++ b/src/spacetraders_models/faction.gleam @@ -1,8 +1,8 @@ import gleam/dynamic/decode.{type Decoder} import gleam/option.{type Option} -import spacetraders_sdk/models/faction_symbol.{type FactionSymbol} -import spacetraders_sdk/models/faction_trait.{type FactionTrait} -import spacetraders_sdk/models/waypoint_symbol.{type WaypointSymbol} +import spacetraders_models/faction_symbol.{type FactionSymbol} +import spacetraders_models/faction_trait.{type FactionTrait} +import spacetraders_models/waypoint_symbol.{type WaypointSymbol} pub type Faction { Faction( diff --git a/src/spacetraders_sdk/models/faction_symbol.gleam b/src/spacetraders_models/faction_symbol.gleam similarity index 100% rename from src/spacetraders_sdk/models/faction_symbol.gleam rename to src/spacetraders_models/faction_symbol.gleam diff --git a/src/spacetraders_sdk/models/faction_trait.gleam b/src/spacetraders_models/faction_trait.gleam similarity index 84% rename from src/spacetraders_sdk/models/faction_trait.gleam rename to src/spacetraders_models/faction_trait.gleam index 5a8ec12..3bbc343 100644 --- a/src/spacetraders_sdk/models/faction_trait.gleam +++ b/src/spacetraders_models/faction_trait.gleam @@ -1,5 +1,5 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/faction_trait_symbol.{type FactionTraitSymbol} +import spacetraders_models/faction_trait_symbol.{type FactionTraitSymbol} pub type FactionTrait { FactionTrait(symbol: FactionTraitSymbol, name: String, description: String) diff --git a/src/spacetraders_sdk/models/faction_trait_symbol.gleam b/src/spacetraders_models/faction_trait_symbol.gleam similarity index 100% rename from src/spacetraders_sdk/models/faction_trait_symbol.gleam rename to src/spacetraders_models/faction_trait_symbol.gleam diff --git a/src/spacetraders_sdk/models/frame_symbol.gleam b/src/spacetraders_models/frame_symbol.gleam similarity index 100% rename from src/spacetraders_sdk/models/frame_symbol.gleam rename to src/spacetraders_models/frame_symbol.gleam diff --git a/src/spacetraders_sdk/models/jump_gate.gleam b/src/spacetraders_models/jump_gate.gleam similarity index 85% rename from src/spacetraders_sdk/models/jump_gate.gleam rename to src/spacetraders_models/jump_gate.gleam index 5310c3d..203f2f6 100644 --- a/src/spacetraders_sdk/models/jump_gate.gleam +++ b/src/spacetraders_models/jump_gate.gleam @@ -1,5 +1,5 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/waypoint_symbol.{type WaypointSymbol} +import spacetraders_models/waypoint_symbol.{type WaypointSymbol} pub type JumpGate { JumpGate(symbol: WaypointSymbol, connections: List(WaypointSymbol)) diff --git a/src/spacetraders_sdk/models/market.gleam b/src/spacetraders_models/market.gleam similarity index 79% rename from src/spacetraders_sdk/models/market.gleam rename to src/spacetraders_models/market.gleam index 8d7eb1e..382d4ab 100644 --- a/src/spacetraders_sdk/models/market.gleam +++ b/src/spacetraders_models/market.gleam @@ -1,9 +1,9 @@ import gleam/dynamic/decode.{type Decoder} import gleam/option.{type Option} -import spacetraders_sdk/models/market_symbol.{type MarketSymbol} -import spacetraders_sdk/models/market_trade_good.{type MarketTradeGood} -import spacetraders_sdk/models/market_transaction.{type MarketTransaction} -import spacetraders_sdk/models/trade_good.{type TradeGood} +import spacetraders_models/market_symbol.{type MarketSymbol} +import spacetraders_models/market_trade_good.{type MarketTradeGood} +import spacetraders_models/market_transaction.{type MarketTransaction} +import spacetraders_models/trade_good.{type TradeGood} pub type Market { Market( diff --git a/src/spacetraders_sdk/models/market_symbol.gleam b/src/spacetraders_models/market_symbol.gleam similarity index 100% rename from src/spacetraders_sdk/models/market_symbol.gleam rename to src/spacetraders_models/market_symbol.gleam diff --git a/src/spacetraders_sdk/models/market_trade_good.gleam b/src/spacetraders_models/market_trade_good.gleam similarity index 79% rename from src/spacetraders_sdk/models/market_trade_good.gleam rename to src/spacetraders_models/market_trade_good.gleam index bd98f68..78d3dea 100644 --- a/src/spacetraders_sdk/models/market_trade_good.gleam +++ b/src/spacetraders_models/market_trade_good.gleam @@ -1,9 +1,9 @@ import gleam/dynamic/decode.{type Decoder} import gleam/option.{type Option} -import spacetraders_sdk/models/activity_level.{type ActivityLevel} -import spacetraders_sdk/models/supply_level.{type SupplyLevel} -import spacetraders_sdk/models/trade_good_type.{type TradeGoodType} -import spacetraders_sdk/models/trade_symbol.{type TradeSymbol} +import spacetraders_models/activity_level.{type ActivityLevel} +import spacetraders_models/supply_level.{type SupplyLevel} +import spacetraders_models/trade_good_type.{type TradeGoodType} +import spacetraders_models/trade_symbol.{type TradeSymbol} pub type MarketTradeGood { MarketTradeGood( diff --git a/src/spacetraders_sdk/models/market_transaction.gleam b/src/spacetraders_models/market_transaction.gleam similarity index 74% rename from src/spacetraders_sdk/models/market_transaction.gleam rename to src/spacetraders_models/market_transaction.gleam index 775b4e6..bf2f735 100644 --- a/src/spacetraders_sdk/models/market_transaction.gleam +++ b/src/spacetraders_models/market_transaction.gleam @@ -1,10 +1,10 @@ import birl.{type Time} import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/ship_symbol.{type ShipSymbol} -import spacetraders_sdk/models/trade_symbol.{type TradeSymbol} -import spacetraders_sdk/models/transaction_type.{type TransactionType} -import spacetraders_sdk/models/waypoint_symbol.{type WaypointSymbol} -import spacetraders_sdk/utils/api +import spacetraders_models/ship_symbol.{type ShipSymbol} +import spacetraders_models/trade_symbol.{type TradeSymbol} +import spacetraders_models/transaction_type.{type TransactionType} +import spacetraders_models/waypoint_symbol.{type WaypointSymbol} +import spacetraders_sdk/internal/time pub type MarketTransaction { MarketTransaction( @@ -30,7 +30,7 @@ pub fn decoder() -> Decoder(MarketTransaction) { use units <- decode.field("units", decode.int) use price_per_unit <- decode.field("pricePerUnit", decode.int) use total_price <- decode.field("totalPrice", decode.int) - use timestamp <- decode.field("timestamp", api.time_decoder()) + use timestamp <- decode.field("timestamp", time.datetime_decoder()) decode.success(MarketTransaction( waypoint_symbol:, ship_symbol:, diff --git a/src/spacetraders_sdk/models/meta.gleam b/src/spacetraders_models/meta.gleam similarity index 100% rename from src/spacetraders_sdk/models/meta.gleam rename to src/spacetraders_models/meta.gleam diff --git a/src/spacetraders_sdk/models/module_symbol.gleam b/src/spacetraders_models/module_symbol.gleam similarity index 100% rename from src/spacetraders_sdk/models/module_symbol.gleam rename to src/spacetraders_models/module_symbol.gleam diff --git a/src/spacetraders_sdk/models/mount_deposit.gleam b/src/spacetraders_models/mount_deposit.gleam similarity index 100% rename from src/spacetraders_sdk/models/mount_deposit.gleam rename to src/spacetraders_models/mount_deposit.gleam diff --git a/src/spacetraders_sdk/models/mount_symbol.gleam b/src/spacetraders_models/mount_symbol.gleam similarity index 100% rename from src/spacetraders_sdk/models/mount_symbol.gleam rename to src/spacetraders_models/mount_symbol.gleam diff --git a/src/spacetraders_sdk/models/public_agent.gleam b/src/spacetraders_models/public_agent.gleam similarity index 78% rename from src/spacetraders_sdk/models/public_agent.gleam rename to src/spacetraders_models/public_agent.gleam index 9d38ea4..3d94bb2 100644 --- a/src/spacetraders_sdk/models/public_agent.gleam +++ b/src/spacetraders_models/public_agent.gleam @@ -1,7 +1,7 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/agent_symbol.{type AgentSymbol} -import spacetraders_sdk/models/faction_symbol.{type FactionSymbol} -import spacetraders_sdk/models/waypoint_symbol.{type WaypointSymbol} +import spacetraders_models/agent_symbol.{type AgentSymbol} +import spacetraders_models/faction_symbol.{type FactionSymbol} +import spacetraders_models/waypoint_symbol.{type WaypointSymbol} pub type PublicAgent { PublicAgent( diff --git a/src/spacetraders_sdk/models/reactor_symbol.gleam b/src/spacetraders_models/reactor_symbol.gleam similarity index 100% rename from src/spacetraders_sdk/models/reactor_symbol.gleam rename to src/spacetraders_models/reactor_symbol.gleam diff --git a/src/spacetraders_sdk/models/refinement_produce.gleam b/src/spacetraders_models/refinement_produce.gleam similarity index 100% rename from src/spacetraders_sdk/models/refinement_produce.gleam rename to src/spacetraders_models/refinement_produce.gleam diff --git a/src/spacetraders_sdk/models/refinement_yield.gleam b/src/spacetraders_models/refinement_yield.gleam similarity index 85% rename from src/spacetraders_sdk/models/refinement_yield.gleam rename to src/spacetraders_models/refinement_yield.gleam index 47cfee0..fa2293a 100644 --- a/src/spacetraders_sdk/models/refinement_yield.gleam +++ b/src/spacetraders_models/refinement_yield.gleam @@ -1,5 +1,5 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/trade_symbol.{type TradeSymbol} +import spacetraders_models/trade_symbol.{type TradeSymbol} pub type RefinementYield { RefinementYield(trade_symbol: TradeSymbol, units: Int) diff --git a/src/spacetraders_sdk/models/repair_transaction.gleam b/src/spacetraders_models/repair_transaction.gleam similarity index 73% rename from src/spacetraders_sdk/models/repair_transaction.gleam rename to src/spacetraders_models/repair_transaction.gleam index 68570ae..dcc42e7 100644 --- a/src/spacetraders_sdk/models/repair_transaction.gleam +++ b/src/spacetraders_models/repair_transaction.gleam @@ -1,8 +1,8 @@ import birl.{type Time} import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/ship_symbol.{type ShipSymbol} -import spacetraders_sdk/models/waypoint_symbol.{type WaypointSymbol} -import spacetraders_sdk/utils/api +import spacetraders_models/ship_symbol.{type ShipSymbol} +import spacetraders_models/waypoint_symbol.{type WaypointSymbol} +import spacetraders_sdk/internal/time pub type RepairTransaction { RepairTransaction( @@ -20,7 +20,7 @@ pub fn decoder() -> Decoder(RepairTransaction) { ) use ship_symbol <- decode.field("shipSymbol", ship_symbol.decoder()) use total_price <- decode.field("totalPrice", decode.int) - use timestamp <- decode.field("timestamp", api.time_decoder()) + use timestamp <- decode.field("timestamp", time.datetime_decoder()) decode.success(RepairTransaction( waypoint_symbol:, ship_symbol:, diff --git a/src/spacetraders_sdk/models/scanned_ship.gleam b/src/spacetraders_models/scanned_ship.gleam similarity index 70% rename from src/spacetraders_sdk/models/scanned_ship.gleam rename to src/spacetraders_models/scanned_ship.gleam index 4b9878b..64d45aa 100644 --- a/src/spacetraders_sdk/models/scanned_ship.gleam +++ b/src/spacetraders_models/scanned_ship.gleam @@ -1,12 +1,12 @@ import gleam/dynamic/decode.{type Decoder} import gleam/option.{type Option} -import spacetraders_sdk/models/scanned_ship_engine.{type ScannedShipEngine} -import spacetraders_sdk/models/scanned_ship_frame.{type ScannedShipFrame} -import spacetraders_sdk/models/scanned_ship_mount.{type ScannedShipMount} -import spacetraders_sdk/models/scanned_ship_reactor.{type ScannedShipReactor} -import spacetraders_sdk/models/ship_nav.{type ShipNav} -import spacetraders_sdk/models/ship_registration.{type ShipRegistration} -import spacetraders_sdk/models/ship_symbol.{type ShipSymbol} +import spacetraders_models/scanned_ship_engine.{type ScannedShipEngine} +import spacetraders_models/scanned_ship_frame.{type ScannedShipFrame} +import spacetraders_models/scanned_ship_mount.{type ScannedShipMount} +import spacetraders_models/scanned_ship_reactor.{type ScannedShipReactor} +import spacetraders_models/ship_nav.{type ShipNav} +import spacetraders_models/ship_registration.{type ShipRegistration} +import spacetraders_models/ship_symbol.{type ShipSymbol} pub type ScannedShip { ScannedShip( diff --git a/src/spacetraders_sdk/models/scanned_ship_engine.gleam b/src/spacetraders_models/scanned_ship_engine.gleam similarity index 81% rename from src/spacetraders_sdk/models/scanned_ship_engine.gleam rename to src/spacetraders_models/scanned_ship_engine.gleam index 22dbb23..70cbeef 100644 --- a/src/spacetraders_sdk/models/scanned_ship_engine.gleam +++ b/src/spacetraders_models/scanned_ship_engine.gleam @@ -1,5 +1,5 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/engine_symbol.{type EngineSymbol} +import spacetraders_models/engine_symbol.{type EngineSymbol} pub type ScannedShipEngine { ScannedShipEngine(symbol: EngineSymbol) diff --git a/src/spacetraders_sdk/models/scanned_ship_frame.gleam b/src/spacetraders_models/scanned_ship_frame.gleam similarity index 81% rename from src/spacetraders_sdk/models/scanned_ship_frame.gleam rename to src/spacetraders_models/scanned_ship_frame.gleam index 8f12e26..16ec4bc 100644 --- a/src/spacetraders_sdk/models/scanned_ship_frame.gleam +++ b/src/spacetraders_models/scanned_ship_frame.gleam @@ -1,5 +1,5 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/frame_symbol.{type FrameSymbol} +import spacetraders_models/frame_symbol.{type FrameSymbol} pub type ScannedShipFrame { ScannedShipFrame(symbol: FrameSymbol) diff --git a/src/spacetraders_sdk/models/scanned_ship_mount.gleam b/src/spacetraders_models/scanned_ship_mount.gleam similarity index 81% rename from src/spacetraders_sdk/models/scanned_ship_mount.gleam rename to src/spacetraders_models/scanned_ship_mount.gleam index f895b99..70c0013 100644 --- a/src/spacetraders_sdk/models/scanned_ship_mount.gleam +++ b/src/spacetraders_models/scanned_ship_mount.gleam @@ -1,5 +1,5 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/mount_symbol.{type MountSymbol} +import spacetraders_models/mount_symbol.{type MountSymbol} pub type ScannedShipMount { ScannedShipMount(symbol: MountSymbol) diff --git a/src/spacetraders_sdk/models/scanned_ship_reactor.gleam b/src/spacetraders_models/scanned_ship_reactor.gleam similarity index 80% rename from src/spacetraders_sdk/models/scanned_ship_reactor.gleam rename to src/spacetraders_models/scanned_ship_reactor.gleam index bdb1f91..5cfdc0c 100644 --- a/src/spacetraders_sdk/models/scanned_ship_reactor.gleam +++ b/src/spacetraders_models/scanned_ship_reactor.gleam @@ -1,5 +1,5 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/reactor_symbol.{type ReactorSymbol} +import spacetraders_models/reactor_symbol.{type ReactorSymbol} pub type ScannedShipReactor { ScannedShipReactor(symbol: ReactorSymbol) diff --git a/src/spacetraders_sdk/models/scanned_system.gleam b/src/spacetraders_models/scanned_system.gleam similarity index 78% rename from src/spacetraders_sdk/models/scanned_system.gleam rename to src/spacetraders_models/scanned_system.gleam index 2a0748a..016f9d1 100644 --- a/src/spacetraders_sdk/models/scanned_system.gleam +++ b/src/spacetraders_models/scanned_system.gleam @@ -1,7 +1,7 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/sector_symbol.{type SectorSymbol} -import spacetraders_sdk/models/system_symbol.{type SystemSymbol} -import spacetraders_sdk/models/system_type.{type SystemType} +import spacetraders_models/sector_symbol.{type SectorSymbol} +import spacetraders_models/system_symbol.{type SystemSymbol} +import spacetraders_models/system_type.{type SystemType} pub type ScannedSystem { ScannedSystem( diff --git a/src/spacetraders_sdk/models/scanned_waypoint.gleam b/src/spacetraders_models/scanned_waypoint.gleam similarity index 73% rename from src/spacetraders_sdk/models/scanned_waypoint.gleam rename to src/spacetraders_models/scanned_waypoint.gleam index 9ff8588..3a92831 100644 --- a/src/spacetraders_sdk/models/scanned_waypoint.gleam +++ b/src/spacetraders_models/scanned_waypoint.gleam @@ -1,12 +1,12 @@ import gleam/dynamic/decode.{type Decoder} import gleam/option.{type Option} -import spacetraders_sdk/models/chart.{type Chart} -import spacetraders_sdk/models/system_symbol.{type SystemSymbol} -import spacetraders_sdk/models/waypoint_faction.{type WaypointFaction} -import spacetraders_sdk/models/waypoint_orbital.{type WaypointOrbital} -import spacetraders_sdk/models/waypoint_symbol.{type WaypointSymbol} -import spacetraders_sdk/models/waypoint_trait.{type WaypointTrait} -import spacetraders_sdk/models/waypoint_type.{type WaypointType} +import spacetraders_models/chart.{type Chart} +import spacetraders_models/system_symbol.{type SystemSymbol} +import spacetraders_models/waypoint_faction.{type WaypointFaction} +import spacetraders_models/waypoint_orbital.{type WaypointOrbital} +import spacetraders_models/waypoint_symbol.{type WaypointSymbol} +import spacetraders_models/waypoint_trait.{type WaypointTrait} +import spacetraders_models/waypoint_type.{type WaypointType} pub type ScannedWaypoint { ScannedWaypoint( diff --git a/src/spacetraders_sdk/models/scrap_transaction.gleam b/src/spacetraders_models/scrap_transaction.gleam similarity index 73% rename from src/spacetraders_sdk/models/scrap_transaction.gleam rename to src/spacetraders_models/scrap_transaction.gleam index 9147192..76dfb35 100644 --- a/src/spacetraders_sdk/models/scrap_transaction.gleam +++ b/src/spacetraders_models/scrap_transaction.gleam @@ -1,8 +1,8 @@ import birl.{type Time} import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/ship_symbol.{type ShipSymbol} -import spacetraders_sdk/models/waypoint_symbol.{type WaypointSymbol} -import spacetraders_sdk/utils/api +import spacetraders_models/ship_symbol.{type ShipSymbol} +import spacetraders_models/waypoint_symbol.{type WaypointSymbol} +import spacetraders_sdk/internal/time pub type ScrapTransaction { ScrapTransaction( @@ -20,7 +20,7 @@ pub fn decoder() -> Decoder(ScrapTransaction) { ) use ship_symbol <- decode.field("shipSymbol", ship_symbol.decoder()) use total_price <- decode.field("totalPrice", decode.int) - use timestamp <- decode.field("timestamp", api.time_decoder()) + use timestamp <- decode.field("timestamp", time.datetime_decoder()) decode.success(ScrapTransaction( waypoint_symbol:, ship_symbol:, diff --git a/src/spacetraders_sdk/models/sector_symbol.gleam b/src/spacetraders_models/sector_symbol.gleam similarity index 100% rename from src/spacetraders_sdk/models/sector_symbol.gleam rename to src/spacetraders_models/sector_symbol.gleam diff --git a/src/spacetraders_sdk/models/ship.gleam b/src/spacetraders_models/ship.gleam similarity index 65% rename from src/spacetraders_sdk/models/ship.gleam rename to src/spacetraders_models/ship.gleam index 7131a0e..0a2c029 100644 --- a/src/spacetraders_sdk/models/ship.gleam +++ b/src/spacetraders_models/ship.gleam @@ -1,16 +1,16 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/cooldown.{type Cooldown} -import spacetraders_sdk/models/ship_cargo.{type ShipCargo} -import spacetraders_sdk/models/ship_crew.{type ShipCrew} -import spacetraders_sdk/models/ship_engine.{type ShipEngine} -import spacetraders_sdk/models/ship_frame.{type ShipFrame} -import spacetraders_sdk/models/ship_fuel.{type ShipFuel} -import spacetraders_sdk/models/ship_module.{type ShipModule} -import spacetraders_sdk/models/ship_mount.{type ShipMount} -import spacetraders_sdk/models/ship_nav.{type ShipNav} -import spacetraders_sdk/models/ship_reactor.{type ShipReactor} -import spacetraders_sdk/models/ship_registration.{type ShipRegistration} -import spacetraders_sdk/models/ship_symbol.{type ShipSymbol} +import spacetraders_models/cooldown.{type Cooldown} +import spacetraders_models/ship_cargo.{type ShipCargo} +import spacetraders_models/ship_crew.{type ShipCrew} +import spacetraders_models/ship_engine.{type ShipEngine} +import spacetraders_models/ship_frame.{type ShipFrame} +import spacetraders_models/ship_fuel.{type ShipFuel} +import spacetraders_models/ship_module.{type ShipModule} +import spacetraders_models/ship_mount.{type ShipMount} +import spacetraders_models/ship_nav.{type ShipNav} +import spacetraders_models/ship_reactor.{type ShipReactor} +import spacetraders_models/ship_registration.{type ShipRegistration} +import spacetraders_models/ship_symbol.{type ShipSymbol} pub type Ship { Ship( diff --git a/src/spacetraders_sdk/models/ship_cargo.gleam b/src/spacetraders_models/ship_cargo.gleam similarity index 86% rename from src/spacetraders_sdk/models/ship_cargo.gleam rename to src/spacetraders_models/ship_cargo.gleam index 7d18bdb..fc85c6a 100644 --- a/src/spacetraders_sdk/models/ship_cargo.gleam +++ b/src/spacetraders_models/ship_cargo.gleam @@ -1,5 +1,5 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/ship_cargo_item.{type ShipCargoItem} +import spacetraders_models/ship_cargo_item.{type ShipCargoItem} pub type ShipCargo { ShipCargo(capacity: Int, units: Int, inventory: List(ShipCargoItem)) diff --git a/src/spacetraders_sdk/models/ship_cargo_item.gleam b/src/spacetraders_models/ship_cargo_item.gleam similarity index 89% rename from src/spacetraders_sdk/models/ship_cargo_item.gleam rename to src/spacetraders_models/ship_cargo_item.gleam index 6a4c1a9..224ec1d 100644 --- a/src/spacetraders_sdk/models/ship_cargo_item.gleam +++ b/src/spacetraders_models/ship_cargo_item.gleam @@ -1,5 +1,5 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/trade_symbol.{type TradeSymbol} +import spacetraders_models/trade_symbol.{type TradeSymbol} pub type ShipCargoItem { ShipCargoItem( diff --git a/src/spacetraders_sdk/models/ship_component.gleam b/src/spacetraders_models/ship_component.gleam similarity index 100% rename from src/spacetraders_sdk/models/ship_component.gleam rename to src/spacetraders_models/ship_component.gleam diff --git a/src/spacetraders_sdk/models/ship_component_condition.gleam b/src/spacetraders_models/ship_component_condition.gleam similarity index 100% rename from src/spacetraders_sdk/models/ship_component_condition.gleam rename to src/spacetraders_models/ship_component_condition.gleam diff --git a/src/spacetraders_sdk/models/ship_component_integrity.gleam b/src/spacetraders_models/ship_component_integrity.gleam similarity index 100% rename from src/spacetraders_sdk/models/ship_component_integrity.gleam rename to src/spacetraders_models/ship_component_integrity.gleam diff --git a/src/spacetraders_sdk/models/ship_component_quality.gleam b/src/spacetraders_models/ship_component_quality.gleam similarity index 100% rename from src/spacetraders_sdk/models/ship_component_quality.gleam rename to src/spacetraders_models/ship_component_quality.gleam diff --git a/src/spacetraders_sdk/models/ship_condition_event.gleam b/src/spacetraders_models/ship_condition_event.gleam similarity index 83% rename from src/spacetraders_sdk/models/ship_condition_event.gleam rename to src/spacetraders_models/ship_condition_event.gleam index d921ae8..465157e 100644 --- a/src/spacetraders_sdk/models/ship_condition_event.gleam +++ b/src/spacetraders_models/ship_condition_event.gleam @@ -1,6 +1,6 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/ship_component.{type ShipComponent} -import spacetraders_sdk/models/ship_condition_event_symbol.{ +import spacetraders_models/ship_component.{type ShipComponent} +import spacetraders_models/ship_condition_event_symbol.{ type ShipConditionEventSymbol, } diff --git a/src/spacetraders_sdk/models/ship_condition_event_symbol.gleam b/src/spacetraders_models/ship_condition_event_symbol.gleam similarity index 100% rename from src/spacetraders_sdk/models/ship_condition_event_symbol.gleam rename to src/spacetraders_models/ship_condition_event_symbol.gleam diff --git a/src/spacetraders_sdk/models/ship_crew.gleam b/src/spacetraders_models/ship_crew.gleam similarity index 91% rename from src/spacetraders_sdk/models/ship_crew.gleam rename to src/spacetraders_models/ship_crew.gleam index 4819416..bc44b04 100644 --- a/src/spacetraders_sdk/models/ship_crew.gleam +++ b/src/spacetraders_models/ship_crew.gleam @@ -1,5 +1,5 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/crew_rotation.{type CrewRotation} +import spacetraders_models/crew_rotation.{type CrewRotation} pub type ShipCrew { ShipCrew( diff --git a/src/spacetraders_sdk/models/ship_engine.gleam b/src/spacetraders_models/ship_engine.gleam similarity index 72% rename from src/spacetraders_sdk/models/ship_engine.gleam rename to src/spacetraders_models/ship_engine.gleam index 4d0dec0..4a9a4be 100644 --- a/src/spacetraders_sdk/models/ship_engine.gleam +++ b/src/spacetraders_models/ship_engine.gleam @@ -1,13 +1,9 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/engine_symbol.{type EngineSymbol} -import spacetraders_sdk/models/ship_component_condition.{ - type ShipComponentCondition, -} -import spacetraders_sdk/models/ship_component_integrity.{ - type ShipComponentIntegrity, -} -import spacetraders_sdk/models/ship_component_quality.{type ShipComponentQuality} -import spacetraders_sdk/models/ship_requirements.{type ShipRequirements} +import spacetraders_models/engine_symbol.{type EngineSymbol} +import spacetraders_models/ship_component_condition.{type ShipComponentCondition} +import spacetraders_models/ship_component_integrity.{type ShipComponentIntegrity} +import spacetraders_models/ship_component_quality.{type ShipComponentQuality} +import spacetraders_models/ship_requirements.{type ShipRequirements} pub type ShipEngine { ShipEngine( diff --git a/src/spacetraders_sdk/models/ship_frame.gleam b/src/spacetraders_models/ship_frame.gleam similarity index 76% rename from src/spacetraders_sdk/models/ship_frame.gleam rename to src/spacetraders_models/ship_frame.gleam index 642db1d..633e2f0 100644 --- a/src/spacetraders_sdk/models/ship_frame.gleam +++ b/src/spacetraders_models/ship_frame.gleam @@ -1,13 +1,9 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/frame_symbol.{type FrameSymbol} -import spacetraders_sdk/models/ship_component_condition.{ - type ShipComponentCondition, -} -import spacetraders_sdk/models/ship_component_integrity.{ - type ShipComponentIntegrity, -} -import spacetraders_sdk/models/ship_component_quality.{type ShipComponentQuality} -import spacetraders_sdk/models/ship_requirements.{type ShipRequirements} +import spacetraders_models/frame_symbol.{type FrameSymbol} +import spacetraders_models/ship_component_condition.{type ShipComponentCondition} +import spacetraders_models/ship_component_integrity.{type ShipComponentIntegrity} +import spacetraders_models/ship_component_quality.{type ShipComponentQuality} +import spacetraders_models/ship_requirements.{type ShipRequirements} pub type ShipFrame { ShipFrame( diff --git a/src/spacetraders_sdk/models/ship_fuel.gleam b/src/spacetraders_models/ship_fuel.gleam similarity index 87% rename from src/spacetraders_sdk/models/ship_fuel.gleam rename to src/spacetraders_models/ship_fuel.gleam index d1d4b75..7ece5f4 100644 --- a/src/spacetraders_sdk/models/ship_fuel.gleam +++ b/src/spacetraders_models/ship_fuel.gleam @@ -1,6 +1,6 @@ import gleam/dynamic/decode.{type Decoder} import gleam/option.{type Option} -import spacetraders_sdk/models/ship_fuel_consumed.{type ShipFuelConsumed} +import spacetraders_models/ship_fuel_consumed.{type ShipFuelConsumed} pub type ShipFuel { ShipFuel(current: Int, capacity: Int, consumed: Option(ShipFuelConsumed)) diff --git a/src/spacetraders_sdk/models/ship_fuel_consumed.gleam b/src/spacetraders_models/ship_fuel_consumed.gleam similarity index 73% rename from src/spacetraders_sdk/models/ship_fuel_consumed.gleam rename to src/spacetraders_models/ship_fuel_consumed.gleam index f9d144e..7ca00be 100644 --- a/src/spacetraders_sdk/models/ship_fuel_consumed.gleam +++ b/src/spacetraders_models/ship_fuel_consumed.gleam @@ -1,6 +1,6 @@ import birl.{type Time} import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/utils/api +import spacetraders_sdk/internal/time pub type ShipFuelConsumed { ShipFuelConsumed(amount: Int, timestamp: Time) @@ -8,6 +8,6 @@ pub type ShipFuelConsumed { pub fn decoder() -> Decoder(ShipFuelConsumed) { use amount <- decode.field("amount", decode.int) - use timestamp <- decode.field("timestamp", api.time_decoder()) + use timestamp <- decode.field("timestamp", time.datetime_decoder()) decode.success(ShipFuelConsumed(amount:, timestamp:)) } diff --git a/src/spacetraders_sdk/models/ship_modification_transaction.gleam b/src/spacetraders_models/ship_modification_transaction.gleam similarity index 73% rename from src/spacetraders_sdk/models/ship_modification_transaction.gleam rename to src/spacetraders_models/ship_modification_transaction.gleam index 83df882..0438405 100644 --- a/src/spacetraders_sdk/models/ship_modification_transaction.gleam +++ b/src/spacetraders_models/ship_modification_transaction.gleam @@ -1,9 +1,9 @@ import birl.{type Time} import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/ship_symbol.{type ShipSymbol} -import spacetraders_sdk/models/trade_symbol.{type TradeSymbol} -import spacetraders_sdk/models/waypoint_symbol.{type WaypointSymbol} -import spacetraders_sdk/utils/api +import spacetraders_models/ship_symbol.{type ShipSymbol} +import spacetraders_models/trade_symbol.{type TradeSymbol} +import spacetraders_models/waypoint_symbol.{type WaypointSymbol} +import spacetraders_sdk/internal/time pub type ShipModificationTransaction { ShipModificationTransaction( @@ -23,7 +23,7 @@ pub fn decoder() -> Decoder(ShipModificationTransaction) { use ship_symbol <- decode.field("shipSymbol", ship_symbol.decoder()) use trade_symbol <- decode.field("tradeSymbol", trade_symbol.decoder()) use total_price <- decode.field("totalPrice", decode.int) - use timestamp <- decode.field("timestamp", api.time_decoder()) + use timestamp <- decode.field("timestamp", time.datetime_decoder()) decode.success(ShipModificationTransaction( waypoint_symbol:, ship_symbol:, diff --git a/src/spacetraders_sdk/models/ship_module.gleam b/src/spacetraders_models/ship_module.gleam similarity index 86% rename from src/spacetraders_sdk/models/ship_module.gleam rename to src/spacetraders_models/ship_module.gleam index 5d80e1a..6f3d0ef 100644 --- a/src/spacetraders_sdk/models/ship_module.gleam +++ b/src/spacetraders_models/ship_module.gleam @@ -1,7 +1,7 @@ import gleam/dynamic/decode.{type Decoder} import gleam/option.{type Option} -import spacetraders_sdk/models/module_symbol.{type ModuleSymbol} -import spacetraders_sdk/models/ship_requirements.{type ShipRequirements} +import spacetraders_models/module_symbol.{type ModuleSymbol} +import spacetraders_models/ship_requirements.{type ShipRequirements} pub type ShipModule { ShipModule( diff --git a/src/spacetraders_sdk/models/ship_mount.gleam b/src/spacetraders_models/ship_mount.gleam similarity index 82% rename from src/spacetraders_sdk/models/ship_mount.gleam rename to src/spacetraders_models/ship_mount.gleam index 7f0f0e2..e4d01e6 100644 --- a/src/spacetraders_sdk/models/ship_mount.gleam +++ b/src/spacetraders_models/ship_mount.gleam @@ -1,8 +1,8 @@ import gleam/dynamic/decode.{type Decoder} import gleam/option.{type Option} -import spacetraders_sdk/models/mount_deposit.{type MountDeposit} -import spacetraders_sdk/models/mount_symbol.{type MountSymbol} -import spacetraders_sdk/models/ship_requirements.{type ShipRequirements} +import spacetraders_models/mount_deposit.{type MountDeposit} +import spacetraders_models/mount_symbol.{type MountSymbol} +import spacetraders_models/ship_requirements.{type ShipRequirements} pub type ShipMount { ShipMount( diff --git a/src/spacetraders_sdk/models/ship_nav.gleam b/src/spacetraders_models/ship_nav.gleam similarity index 69% rename from src/spacetraders_sdk/models/ship_nav.gleam rename to src/spacetraders_models/ship_nav.gleam index a2a36a2..e1c0a09 100644 --- a/src/spacetraders_sdk/models/ship_nav.gleam +++ b/src/spacetraders_models/ship_nav.gleam @@ -1,9 +1,9 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/ship_nav_flight_mode.{type ShipNavFlightMode} -import spacetraders_sdk/models/ship_nav_route.{type ShipNavRoute} -import spacetraders_sdk/models/ship_nav_status.{type ShipNavStatus} -import spacetraders_sdk/models/system_symbol.{type SystemSymbol} -import spacetraders_sdk/models/waypoint_symbol.{type WaypointSymbol} +import spacetraders_models/ship_nav_flight_mode.{type ShipNavFlightMode} +import spacetraders_models/ship_nav_route.{type ShipNavRoute} +import spacetraders_models/ship_nav_status.{type ShipNavStatus} +import spacetraders_models/system_symbol.{type SystemSymbol} +import spacetraders_models/waypoint_symbol.{type WaypointSymbol} pub type ShipNav { ShipNav( diff --git a/src/spacetraders_sdk/models/ship_nav_flight_mode.gleam b/src/spacetraders_models/ship_nav_flight_mode.gleam similarity index 100% rename from src/spacetraders_sdk/models/ship_nav_flight_mode.gleam rename to src/spacetraders_models/ship_nav_flight_mode.gleam diff --git a/src/spacetraders_sdk/models/ship_nav_route.gleam b/src/spacetraders_models/ship_nav_route.gleam similarity index 66% rename from src/spacetraders_sdk/models/ship_nav_route.gleam rename to src/spacetraders_models/ship_nav_route.gleam index 0f0adfe..36571c4 100644 --- a/src/spacetraders_sdk/models/ship_nav_route.gleam +++ b/src/spacetraders_models/ship_nav_route.gleam @@ -1,9 +1,7 @@ import birl.{type Time} import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/ship_nav_route_waypoint.{ - type ShipNavRouteWaypoint, -} -import spacetraders_sdk/utils/api +import spacetraders_models/ship_nav_route_waypoint.{type ShipNavRouteWaypoint} +import spacetraders_sdk/internal/time pub type ShipNavRoute { ShipNavRoute( @@ -20,7 +18,7 @@ pub fn decoder() -> Decoder(ShipNavRoute) { ship_nav_route_waypoint.decoder(), ) use origin <- decode.field("origin", ship_nav_route_waypoint.decoder()) - use departure_time <- decode.field("departureTime", api.time_decoder()) - use arrival <- decode.field("arrival", api.time_decoder()) + use departure_time <- decode.field("departureTime", time.datetime_decoder()) + use arrival <- decode.field("arrival", time.datetime_decoder()) decode.success(ShipNavRoute(destination:, origin:, departure_time:, arrival:)) } diff --git a/src/spacetraders_sdk/models/ship_nav_route_waypoint.gleam b/src/spacetraders_models/ship_nav_route_waypoint.gleam similarity index 76% rename from src/spacetraders_sdk/models/ship_nav_route_waypoint.gleam rename to src/spacetraders_models/ship_nav_route_waypoint.gleam index b26cd66..12111b6 100644 --- a/src/spacetraders_sdk/models/ship_nav_route_waypoint.gleam +++ b/src/spacetraders_models/ship_nav_route_waypoint.gleam @@ -1,7 +1,7 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/system_symbol.{type SystemSymbol} -import spacetraders_sdk/models/waypoint_symbol.{type WaypointSymbol} -import spacetraders_sdk/models/waypoint_type.{type WaypointType} +import spacetraders_models/system_symbol.{type SystemSymbol} +import spacetraders_models/waypoint_symbol.{type WaypointSymbol} +import spacetraders_models/waypoint_type.{type WaypointType} pub type ShipNavRouteWaypoint { ShipNavRouteWaypoint( diff --git a/src/spacetraders_sdk/models/ship_nav_status.gleam b/src/spacetraders_models/ship_nav_status.gleam similarity index 100% rename from src/spacetraders_sdk/models/ship_nav_status.gleam rename to src/spacetraders_models/ship_nav_status.gleam diff --git a/src/spacetraders_sdk/models/ship_reactor.gleam b/src/spacetraders_models/ship_reactor.gleam similarity index 73% rename from src/spacetraders_sdk/models/ship_reactor.gleam rename to src/spacetraders_models/ship_reactor.gleam index 934760b..e11f859 100644 --- a/src/spacetraders_sdk/models/ship_reactor.gleam +++ b/src/spacetraders_models/ship_reactor.gleam @@ -1,13 +1,9 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/reactor_symbol.{type ReactorSymbol} -import spacetraders_sdk/models/ship_component_condition.{ - type ShipComponentCondition, -} -import spacetraders_sdk/models/ship_component_integrity.{ - type ShipComponentIntegrity, -} -import spacetraders_sdk/models/ship_component_quality.{type ShipComponentQuality} -import spacetraders_sdk/models/ship_requirements.{type ShipRequirements} +import spacetraders_models/reactor_symbol.{type ReactorSymbol} +import spacetraders_models/ship_component_condition.{type ShipComponentCondition} +import spacetraders_models/ship_component_integrity.{type ShipComponentIntegrity} +import spacetraders_models/ship_component_quality.{type ShipComponentQuality} +import spacetraders_models/ship_requirements.{type ShipRequirements} pub type ShipReactor { ShipReactor( diff --git a/src/spacetraders_sdk/models/ship_registration.gleam b/src/spacetraders_models/ship_registration.gleam similarity index 78% rename from src/spacetraders_sdk/models/ship_registration.gleam rename to src/spacetraders_models/ship_registration.gleam index 1dab7f6..f3cf1a3 100644 --- a/src/spacetraders_sdk/models/ship_registration.gleam +++ b/src/spacetraders_models/ship_registration.gleam @@ -1,6 +1,6 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/faction_symbol.{type FactionSymbol} -import spacetraders_sdk/models/ship_role.{type ShipRole} +import spacetraders_models/faction_symbol.{type FactionSymbol} +import spacetraders_models/ship_role.{type ShipRole} pub type ShipRegistration { ShipRegistration(name: String, faction_symbol: FactionSymbol, role: ShipRole) diff --git a/src/spacetraders_sdk/models/ship_requirements.gleam b/src/spacetraders_models/ship_requirements.gleam similarity index 100% rename from src/spacetraders_sdk/models/ship_requirements.gleam rename to src/spacetraders_models/ship_requirements.gleam diff --git a/src/spacetraders_sdk/models/ship_role.gleam b/src/spacetraders_models/ship_role.gleam similarity index 100% rename from src/spacetraders_sdk/models/ship_role.gleam rename to src/spacetraders_models/ship_role.gleam diff --git a/src/spacetraders_sdk/models/ship_symbol.gleam b/src/spacetraders_models/ship_symbol.gleam similarity index 100% rename from src/spacetraders_sdk/models/ship_symbol.gleam rename to src/spacetraders_models/ship_symbol.gleam diff --git a/src/spacetraders_sdk/models/ship_type.gleam b/src/spacetraders_models/ship_type.gleam similarity index 100% rename from src/spacetraders_sdk/models/ship_type.gleam rename to src/spacetraders_models/ship_type.gleam diff --git a/src/spacetraders_sdk/models/shipyard.gleam b/src/spacetraders_models/shipyard.gleam similarity index 78% rename from src/spacetraders_sdk/models/shipyard.gleam rename to src/spacetraders_models/shipyard.gleam index 03bce4a..86c2d66 100644 --- a/src/spacetraders_sdk/models/shipyard.gleam +++ b/src/spacetraders_models/shipyard.gleam @@ -1,9 +1,9 @@ import gleam/dynamic/decode.{type Decoder} import gleam/option.{type Option} -import spacetraders_sdk/models/ship_type.{type ShipType} -import spacetraders_sdk/models/shipyard_ship.{type ShipyardShip} -import spacetraders_sdk/models/shipyard_symbol.{type ShipyardSymbol} -import spacetraders_sdk/models/shipyard_transaction.{type ShipyardTransaction} +import spacetraders_models/ship_type.{type ShipType} +import spacetraders_models/shipyard_ship.{type ShipyardShip} +import spacetraders_models/shipyard_symbol.{type ShipyardSymbol} +import spacetraders_models/shipyard_transaction.{type ShipyardTransaction} pub type Shipyard { Shipyard( diff --git a/src/spacetraders_sdk/models/shipyard_ship.gleam b/src/spacetraders_models/shipyard_ship.gleam similarity index 72% rename from src/spacetraders_sdk/models/shipyard_ship.gleam rename to src/spacetraders_models/shipyard_ship.gleam index 824b231..51b5613 100644 --- a/src/spacetraders_sdk/models/shipyard_ship.gleam +++ b/src/spacetraders_models/shipyard_ship.gleam @@ -1,14 +1,14 @@ import gleam/dynamic/decode.{type Decoder} import gleam/option.{type Option} -import spacetraders_sdk/models/activity_level.{type ActivityLevel} -import spacetraders_sdk/models/ship_engine.{type ShipEngine} -import spacetraders_sdk/models/ship_frame.{type ShipFrame} -import spacetraders_sdk/models/ship_module.{type ShipModule} -import spacetraders_sdk/models/ship_mount.{type ShipMount} -import spacetraders_sdk/models/ship_reactor.{type ShipReactor} -import spacetraders_sdk/models/ship_type.{type ShipType} -import spacetraders_sdk/models/shipyard_ship_crew.{type ShipyardShipCrew} -import spacetraders_sdk/models/supply_level.{type SupplyLevel} +import spacetraders_models/activity_level.{type ActivityLevel} +import spacetraders_models/ship_engine.{type ShipEngine} +import spacetraders_models/ship_frame.{type ShipFrame} +import spacetraders_models/ship_module.{type ShipModule} +import spacetraders_models/ship_mount.{type ShipMount} +import spacetraders_models/ship_reactor.{type ShipReactor} +import spacetraders_models/ship_type.{type ShipType} +import spacetraders_models/shipyard_ship_crew.{type ShipyardShipCrew} +import spacetraders_models/supply_level.{type SupplyLevel} pub type ShipyardShip { ShipyardShip( diff --git a/src/spacetraders_sdk/models/shipyard_ship_crew.gleam b/src/spacetraders_models/shipyard_ship_crew.gleam similarity index 100% rename from src/spacetraders_sdk/models/shipyard_ship_crew.gleam rename to src/spacetraders_models/shipyard_ship_crew.gleam diff --git a/src/spacetraders_sdk/models/shipyard_symbol.gleam b/src/spacetraders_models/shipyard_symbol.gleam similarity index 100% rename from src/spacetraders_sdk/models/shipyard_symbol.gleam rename to src/spacetraders_models/shipyard_symbol.gleam diff --git a/src/spacetraders_sdk/models/shipyard_transaction.gleam b/src/spacetraders_models/shipyard_transaction.gleam similarity index 71% rename from src/spacetraders_sdk/models/shipyard_transaction.gleam rename to src/spacetraders_models/shipyard_transaction.gleam index 7430dae..0d82b7f 100644 --- a/src/spacetraders_sdk/models/shipyard_transaction.gleam +++ b/src/spacetraders_models/shipyard_transaction.gleam @@ -1,9 +1,9 @@ import birl.{type Time} import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/agent_symbol.{type AgentSymbol} -import spacetraders_sdk/models/ship_type.{type ShipType} -import spacetraders_sdk/models/waypoint_symbol.{type WaypointSymbol} -import spacetraders_sdk/utils/api +import spacetraders_models/agent_symbol.{type AgentSymbol} +import spacetraders_models/ship_type.{type ShipType} +import spacetraders_models/waypoint_symbol.{type WaypointSymbol} +import spacetraders_sdk/internal/time pub type ShipyardTransaction { ShipyardTransaction( @@ -23,7 +23,7 @@ pub fn decoder() -> Decoder(ShipyardTransaction) { use ship_type <- decode.field("shipType", ship_type.decoder()) use price <- decode.field("price", decode.int) use agent_symbol <- decode.field("agentSymbol", agent_symbol.decoder()) - use timestamp <- decode.field("timestamp", api.time_decoder()) + use timestamp <- decode.field("timestamp", time.datetime_decoder()) decode.success(ShipyardTransaction( waypoint_symbol:, ship_type:, diff --git a/src/spacetraders_sdk/models/siphon.gleam b/src/spacetraders_models/siphon.gleam similarity index 73% rename from src/spacetraders_sdk/models/siphon.gleam rename to src/spacetraders_models/siphon.gleam index 7aab7df..6db7b1d 100644 --- a/src/spacetraders_sdk/models/siphon.gleam +++ b/src/spacetraders_models/siphon.gleam @@ -1,6 +1,6 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/ship_symbol.{type ShipSymbol} -import spacetraders_sdk/models/siphon_yield.{type SiphonYield} +import spacetraders_models/ship_symbol.{type ShipSymbol} +import spacetraders_models/siphon_yield.{type SiphonYield} pub type Siphon { Siphon(ship_symbol: ShipSymbol, yield: SiphonYield) diff --git a/src/spacetraders_sdk/models/siphon_yield.gleam b/src/spacetraders_models/siphon_yield.gleam similarity index 83% rename from src/spacetraders_sdk/models/siphon_yield.gleam rename to src/spacetraders_models/siphon_yield.gleam index 3cd9f27..1e528b8 100644 --- a/src/spacetraders_sdk/models/siphon_yield.gleam +++ b/src/spacetraders_models/siphon_yield.gleam @@ -1,5 +1,5 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/trade_symbol.{type TradeSymbol} +import spacetraders_models/trade_symbol.{type TradeSymbol} pub type SiphonYield { SiphonYield(symbol: TradeSymbol, units: Int) diff --git a/src/spacetraders_sdk/models/supply_level.gleam b/src/spacetraders_models/supply_level.gleam similarity index 100% rename from src/spacetraders_sdk/models/supply_level.gleam rename to src/spacetraders_models/supply_level.gleam diff --git a/src/spacetraders_sdk/models/survey.gleam b/src/spacetraders_models/survey.gleam similarity index 74% rename from src/spacetraders_sdk/models/survey.gleam rename to src/spacetraders_models/survey.gleam index 8a0506d..64be72c 100644 --- a/src/spacetraders_sdk/models/survey.gleam +++ b/src/spacetraders_models/survey.gleam @@ -1,11 +1,11 @@ import birl.{type Time} import gleam/dynamic/decode.{type Decoder} import gleam/json.{type Json} -import spacetraders_sdk/models/survey_deposit.{type SurveyDeposit} -import spacetraders_sdk/models/survey_signature.{type SurveySignature} -import spacetraders_sdk/models/survey_size.{type SurveySize} -import spacetraders_sdk/models/waypoint_symbol.{type WaypointSymbol} -import spacetraders_sdk/utils/api +import spacetraders_models/survey_deposit.{type SurveyDeposit} +import spacetraders_models/survey_signature.{type SurveySignature} +import spacetraders_models/survey_size.{type SurveySize} +import spacetraders_models/waypoint_symbol.{type WaypointSymbol} +import spacetraders_sdk/internal/time pub type Survey { Survey( @@ -24,7 +24,7 @@ pub fn decoder() -> Decoder(Survey) { "deposits", decode.list(survey_deposit.decoder()), ) - use expiration <- decode.field("expiration", api.time_decoder()) + use expiration <- decode.field("expiration", time.datetime_decoder()) use size <- decode.field("size", survey_size.decoder()) decode.success(Survey(signature:, symbol:, deposits:, expiration:, size:)) } diff --git a/src/spacetraders_sdk/models/survey_deposit.gleam b/src/spacetraders_models/survey_deposit.gleam similarity index 86% rename from src/spacetraders_sdk/models/survey_deposit.gleam rename to src/spacetraders_models/survey_deposit.gleam index 94c36ef..c4eec19 100644 --- a/src/spacetraders_sdk/models/survey_deposit.gleam +++ b/src/spacetraders_models/survey_deposit.gleam @@ -1,6 +1,6 @@ import gleam/dynamic/decode.{type Decoder} import gleam/json.{type Json} -import spacetraders_sdk/models/trade_symbol.{type TradeSymbol} +import spacetraders_models/trade_symbol.{type TradeSymbol} pub type SurveyDeposit { SurveyDeposit(symbol: TradeSymbol) diff --git a/src/spacetraders_sdk/models/survey_signature.gleam b/src/spacetraders_models/survey_signature.gleam similarity index 100% rename from src/spacetraders_sdk/models/survey_signature.gleam rename to src/spacetraders_models/survey_signature.gleam diff --git a/src/spacetraders_sdk/models/survey_size.gleam b/src/spacetraders_models/survey_size.gleam similarity index 100% rename from src/spacetraders_sdk/models/survey_size.gleam rename to src/spacetraders_models/survey_size.gleam diff --git a/src/spacetraders_sdk/models/system.gleam b/src/spacetraders_models/system.gleam similarity index 76% rename from src/spacetraders_sdk/models/system.gleam rename to src/spacetraders_models/system.gleam index 5211c63..6e8f8da 100644 --- a/src/spacetraders_sdk/models/system.gleam +++ b/src/spacetraders_models/system.gleam @@ -1,11 +1,11 @@ import gleam/dynamic/decode.{type Decoder} import gleam/option.{type Option} -import spacetraders_sdk/models/constellation.{type Constellation} -import spacetraders_sdk/models/sector_symbol.{type SectorSymbol} -import spacetraders_sdk/models/system_faction.{type SystemFaction} -import spacetraders_sdk/models/system_symbol.{type SystemSymbol} -import spacetraders_sdk/models/system_type.{type SystemType} -import spacetraders_sdk/models/system_waypoint.{type SystemWaypoint} +import spacetraders_models/constellation.{type Constellation} +import spacetraders_models/sector_symbol.{type SectorSymbol} +import spacetraders_models/system_faction.{type SystemFaction} +import spacetraders_models/system_symbol.{type SystemSymbol} +import spacetraders_models/system_type.{type SystemType} +import spacetraders_models/system_waypoint.{type SystemWaypoint} pub type System { System( diff --git a/src/spacetraders_sdk/models/system_faction.gleam b/src/spacetraders_models/system_faction.gleam similarity index 79% rename from src/spacetraders_sdk/models/system_faction.gleam rename to src/spacetraders_models/system_faction.gleam index f3a9187..4a7b37e 100644 --- a/src/spacetraders_sdk/models/system_faction.gleam +++ b/src/spacetraders_models/system_faction.gleam @@ -1,5 +1,5 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/faction_symbol.{type FactionSymbol} +import spacetraders_models/faction_symbol.{type FactionSymbol} pub type SystemFaction { SystemFaction(symbol: FactionSymbol) diff --git a/src/spacetraders_sdk/models/system_symbol.gleam b/src/spacetraders_models/system_symbol.gleam similarity index 100% rename from src/spacetraders_sdk/models/system_symbol.gleam rename to src/spacetraders_models/system_symbol.gleam diff --git a/src/spacetraders_sdk/models/system_type.gleam b/src/spacetraders_models/system_type.gleam similarity index 100% rename from src/spacetraders_sdk/models/system_type.gleam rename to src/spacetraders_models/system_type.gleam diff --git a/src/spacetraders_sdk/models/system_waypoint.gleam b/src/spacetraders_models/system_waypoint.gleam similarity index 80% rename from src/spacetraders_sdk/models/system_waypoint.gleam rename to src/spacetraders_models/system_waypoint.gleam index 4e44d60..3e90588 100644 --- a/src/spacetraders_sdk/models/system_waypoint.gleam +++ b/src/spacetraders_models/system_waypoint.gleam @@ -1,8 +1,8 @@ import gleam/dynamic/decode.{type Decoder} import gleam/option.{type Option} -import spacetraders_sdk/models/waypoint_orbital.{type WaypointOrbital} -import spacetraders_sdk/models/waypoint_symbol.{type WaypointSymbol} -import spacetraders_sdk/models/waypoint_type.{type WaypointType} +import spacetraders_models/waypoint_orbital.{type WaypointOrbital} +import spacetraders_models/waypoint_symbol.{type WaypointSymbol} +import spacetraders_models/waypoint_type.{type WaypointType} pub type SystemWaypoint { SystemWaypoint( diff --git a/src/spacetraders_sdk/models/trade_good.gleam b/src/spacetraders_models/trade_good.gleam similarity index 86% rename from src/spacetraders_sdk/models/trade_good.gleam rename to src/spacetraders_models/trade_good.gleam index a448d24..5871518 100644 --- a/src/spacetraders_sdk/models/trade_good.gleam +++ b/src/spacetraders_models/trade_good.gleam @@ -1,5 +1,5 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/trade_symbol.{type TradeSymbol} +import spacetraders_models/trade_symbol.{type TradeSymbol} pub type TradeGood { TradeGood(symbol: TradeSymbol, name: String, description: String) diff --git a/src/spacetraders_sdk/models/trade_good_type.gleam b/src/spacetraders_models/trade_good_type.gleam similarity index 100% rename from src/spacetraders_sdk/models/trade_good_type.gleam rename to src/spacetraders_models/trade_good_type.gleam diff --git a/src/spacetraders_sdk/models/trade_symbol.gleam b/src/spacetraders_models/trade_symbol.gleam similarity index 100% rename from src/spacetraders_sdk/models/trade_symbol.gleam rename to src/spacetraders_models/trade_symbol.gleam diff --git a/src/spacetraders_sdk/models/transaction_type.gleam b/src/spacetraders_models/transaction_type.gleam similarity index 100% rename from src/spacetraders_sdk/models/transaction_type.gleam rename to src/spacetraders_models/transaction_type.gleam diff --git a/src/spacetraders_sdk/models/waypoint.gleam b/src/spacetraders_models/waypoint.gleam similarity index 76% rename from src/spacetraders_sdk/models/waypoint.gleam rename to src/spacetraders_models/waypoint.gleam index 17ee06d..e56d01b 100644 --- a/src/spacetraders_sdk/models/waypoint.gleam +++ b/src/spacetraders_models/waypoint.gleam @@ -1,13 +1,13 @@ import gleam/dynamic/decode.{type Decoder} import gleam/option.{type Option} -import spacetraders_sdk/models/chart.{type Chart} -import spacetraders_sdk/models/system_symbol.{type SystemSymbol} -import spacetraders_sdk/models/waypoint_faction.{type WaypointFaction} -import spacetraders_sdk/models/waypoint_modifier.{type WaypointModifier} -import spacetraders_sdk/models/waypoint_orbital.{type WaypointOrbital} -import spacetraders_sdk/models/waypoint_symbol.{type WaypointSymbol} -import spacetraders_sdk/models/waypoint_trait.{type WaypointTrait} -import spacetraders_sdk/models/waypoint_type.{type WaypointType} +import spacetraders_models/chart.{type Chart} +import spacetraders_models/system_symbol.{type SystemSymbol} +import spacetraders_models/waypoint_faction.{type WaypointFaction} +import spacetraders_models/waypoint_modifier.{type WaypointModifier} +import spacetraders_models/waypoint_orbital.{type WaypointOrbital} +import spacetraders_models/waypoint_symbol.{type WaypointSymbol} +import spacetraders_models/waypoint_trait.{type WaypointTrait} +import spacetraders_models/waypoint_type.{type WaypointType} pub type Waypoint { Waypoint( diff --git a/src/spacetraders_sdk/models/waypoint_faction.gleam b/src/spacetraders_models/waypoint_faction.gleam similarity index 80% rename from src/spacetraders_sdk/models/waypoint_faction.gleam rename to src/spacetraders_models/waypoint_faction.gleam index 733630f..92ae2c4 100644 --- a/src/spacetraders_sdk/models/waypoint_faction.gleam +++ b/src/spacetraders_models/waypoint_faction.gleam @@ -1,5 +1,5 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/faction_symbol.{type FactionSymbol} +import spacetraders_models/faction_symbol.{type FactionSymbol} pub type WaypointFaction { WaypointFaction(symbol: FactionSymbol) diff --git a/src/spacetraders_sdk/models/waypoint_modifier.gleam b/src/spacetraders_models/waypoint_modifier.gleam similarity index 84% rename from src/spacetraders_sdk/models/waypoint_modifier.gleam rename to src/spacetraders_models/waypoint_modifier.gleam index 1087820..891452d 100644 --- a/src/spacetraders_sdk/models/waypoint_modifier.gleam +++ b/src/spacetraders_models/waypoint_modifier.gleam @@ -1,7 +1,5 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/waypoint_modifier_symbol.{ - type WaypointModifierSymbol, -} +import spacetraders_models/waypoint_modifier_symbol.{type WaypointModifierSymbol} pub type WaypointModifier { WaypointModifier( diff --git a/src/spacetraders_sdk/models/waypoint_modifier_symbol.gleam b/src/spacetraders_models/waypoint_modifier_symbol.gleam similarity index 100% rename from src/spacetraders_sdk/models/waypoint_modifier_symbol.gleam rename to src/spacetraders_models/waypoint_modifier_symbol.gleam diff --git a/src/spacetraders_sdk/models/waypoint_orbital.gleam b/src/spacetraders_models/waypoint_orbital.gleam similarity index 79% rename from src/spacetraders_sdk/models/waypoint_orbital.gleam rename to src/spacetraders_models/waypoint_orbital.gleam index 2b44629..668bf1f 100644 --- a/src/spacetraders_sdk/models/waypoint_orbital.gleam +++ b/src/spacetraders_models/waypoint_orbital.gleam @@ -1,5 +1,5 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/waypoint_symbol.{type WaypointSymbol} +import spacetraders_models/waypoint_symbol.{type WaypointSymbol} pub type WaypointOrbital { WaypointOrbital(symbol: WaypointSymbol) diff --git a/src/spacetraders_sdk/models/waypoint_symbol.gleam b/src/spacetraders_models/waypoint_symbol.gleam similarity index 100% rename from src/spacetraders_sdk/models/waypoint_symbol.gleam rename to src/spacetraders_models/waypoint_symbol.gleam diff --git a/src/spacetraders_sdk/models/waypoint_trait.gleam b/src/spacetraders_models/waypoint_trait.gleam similarity index 84% rename from src/spacetraders_sdk/models/waypoint_trait.gleam rename to src/spacetraders_models/waypoint_trait.gleam index efc4250..375b8b1 100644 --- a/src/spacetraders_sdk/models/waypoint_trait.gleam +++ b/src/spacetraders_models/waypoint_trait.gleam @@ -1,5 +1,5 @@ import gleam/dynamic/decode.{type Decoder} -import spacetraders_sdk/models/waypoint_trait_symbol.{type WaypointTraitSymbol} +import spacetraders_models/waypoint_trait_symbol.{type WaypointTraitSymbol} pub type WaypointTrait { WaypointTrait(symbol: WaypointTraitSymbol, name: String, description: String) diff --git a/src/spacetraders_sdk/models/waypoint_trait_symbol.gleam b/src/spacetraders_models/waypoint_trait_symbol.gleam similarity index 100% rename from src/spacetraders_sdk/models/waypoint_trait_symbol.gleam rename to src/spacetraders_models/waypoint_trait_symbol.gleam diff --git a/src/spacetraders_sdk/models/waypoint_type.gleam b/src/spacetraders_models/waypoint_type.gleam similarity index 100% rename from src/spacetraders_sdk/models/waypoint_type.gleam rename to src/spacetraders_models/waypoint_type.gleam diff --git a/src/spacetraders_sdk.gleam b/src/spacetraders_sdk.gleam index 187ee36..495051c 100644 --- a/src/spacetraders_sdk.gleam +++ b/src/spacetraders_sdk.gleam @@ -1,134 +1,33 @@ -import spacetraders_sdk/endpoints/accounts -import spacetraders_sdk/endpoints/agents -import spacetraders_sdk/endpoints/contracts -import spacetraders_sdk/endpoints/data -import spacetraders_sdk/endpoints/factions -import spacetraders_sdk/endpoints/fleet -import spacetraders_sdk/endpoints/global -import spacetraders_sdk/endpoints/systems +import spacetraders_sdk/internal/api -pub const get_account = accounts.get_account +pub type ApiResponse(data) = + api.ApiResponse(data) -pub const register_new_agent = accounts.register_new_agent +pub type ApiError = + api.ApiError -pub const list_public_agents = agents.list_public_agents +pub type ErrorResponse = + api.ErrorResponse -pub const get_public_agent = agents.get_public_agent +pub type PagedData(data) = + api.PagedData(data) -pub const get_agent = agents.get_agent +pub type AccountToken = + api.AccountToken -pub const get_agent_events = agents.get_agent_events +pub type AgentToken = + api.AgentToken -pub const list_contracts = contracts.list_contracts +pub type TokenParseError = + api.TokenParseError -pub const get_contract = contracts.get_contract +pub type AuthMethod = + api.AuthMethod -pub const accept_contract = contracts.accept_contract +pub const parse_account_token = api.parse_account_token -pub const fulfill_contract = contracts.fulfill_contract +pub const account_token_decoder = api.account_token_decoder -pub const deliver_contract_cargo = contracts.deliver_contract_cargo +pub const parse_agent_token = api.parse_agent_token -pub const list_factions = factions.list_factions - -pub const get_faction = factions.get_faction - -pub const get_my_factions = factions.get_my_factions - -pub const list_ships = fleet.list_ships - -pub const purchase_ship = fleet.purchase_ship - -pub const get_ship = fleet.get_ship - -pub const create_chart = fleet.create_chart - -pub const negotiate_contract = fleet.negotiate_contract - -pub const get_ship_cooldown = fleet.get_ship_cooldown - -pub const dock_ship = fleet.dock_ship - -pub const extract_resources = fleet.extract_resources - -pub const extract_resources_with_survey = fleet.extract_resources_with_survey - -pub const jettison_cargo = fleet.jettison_cargo - -pub const jump_ship = fleet.jump_ship - -pub const scan_systems = fleet.scan_systems - -pub const scan_waypoints = fleet.scan_waypoints - -pub const scan_ships = fleet.scan_ships - -pub const scrap_ship = fleet.scrap_ship - -pub const get_scrap_ship = fleet.get_scrap_ship - -pub const navigate_ship = fleet.navigate_ship - -pub const warp_ship = fleet.warp_ship - -pub const orbit_ship = fleet.orbit_ship - -pub const purchase_cargo = fleet.purchase_cargo - -pub const refine_ship = fleet.refine_ship - -pub const refuel_ship = fleet.refuel_ship - -pub const repair_ship = fleet.repair_ship - -pub const get_repair_ship = fleet.repair_ship - -pub const sell_cargo = fleet.sell_cargo - -pub const siphon_resources = fleet.siphon_resources - -pub const create_survey = fleet.create_survey - -pub const transfer_cargo = fleet.transfer_cargo - -pub const get_ship_cargo = fleet.get_ship_cargo - -pub const get_ship_modules = fleet.get_ship_modules - -pub const install_ship_module = fleet.install_ship_module - -pub const remove_ship_module = fleet.remove_ship_module - -pub const get_ship_mounts = fleet.get_ship_mounts - -pub const install_ship_mount = fleet.install_ship_mount - -pub const remove_ship_mount = fleet.remove_ship_mount - -pub const get_ship_nav = fleet.get_ship_nav - -pub const patch_ship_nav = fleet.patch_ship_nav - -pub const list_systems = systems.list_systems - -pub const get_system = systems.get_system - -pub const list_system_waypoints = systems.list_system_waypoints - -pub const get_waypoint = systems.get_waypoint - -pub const get_construction_site = systems.get_construction_site - -pub const supply_construction_site = systems.supply_construction_site - -pub const get_market = systems.get_market - -pub const get_jump_gate = systems.get_jump_gate - -pub const get_shipyard = systems.get_shipyard - -pub const get_supply_chain = data.get_supply_chain - -pub const get_server_status = global.get_server_status - -pub const list_error_codes = global.list_error_codes +pub const agent_token_decoder = api.agent_token_decoder diff --git a/src/spacetraders_sdk/endpoints/accounts.gleam b/src/spacetraders_sdk/endpoints/accounts.gleam deleted file mode 100644 index 8a2cf0f..0000000 --- a/src/spacetraders_sdk/endpoints/accounts.gleam +++ /dev/null @@ -1,71 +0,0 @@ -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) - } -} diff --git a/src/spacetraders_sdk/endpoints/agents.gleam b/src/spacetraders_sdk/endpoints/agents.gleam deleted file mode 100644 index 6fbddde..0000000 --- a/src/spacetraders_sdk/endpoints/agents.gleam +++ /dev/null @@ -1,52 +0,0 @@ -import gleam/dynamic/decode -import gleam/option.{type Option} -import spacetraders_sdk/models/agent.{type Agent} -import spacetraders_sdk/models/agent_event.{type AgentEvent} -import spacetraders_sdk/models/agent_symbol.{type AgentSymbol} -import spacetraders_sdk/models/public_agent.{type PublicAgent} -import spacetraders_sdk/utils/api.{type ApiResponse, type PagedData} -import spacetraders_sdk/utils/auth.{type AgentToken, AgentAuth, NoAuth} - -pub fn list_public_agents( - page: Option(Int), - limit: Option(Int), -) -> ApiResponse(PagedData(List(PublicAgent))) { - let request = api.get_page(NoAuth, "/agents", page, limit) - use response <- api.try_send(request) - case response.status { - 200 -> - api.parse_paged_data_response( - response, - decode.list(public_agent.decoder()), - ) - _ -> api.parse_error_response(response) - } -} - -pub fn get_public_agent(agent_symbol: AgentSymbol) -> ApiResponse(PublicAgent) { - let request = - api.get(NoAuth, "/agents/" <> agent_symbol.to_string(agent_symbol)) - use response <- api.try_send(request) - case response.status { - 200 -> api.parse_data_response(response, public_agent.decoder()) - _ -> api.parse_error_response(response) - } -} - -pub fn get_agent(token: AgentToken) -> ApiResponse(Agent) { - let request = api.get(AgentAuth(token), "/my/agent") - use response <- api.try_send(request) - case response.status { - 200 -> api.parse_data_response(response, agent.decoder()) - _ -> api.parse_error_response(response) - } -} - -pub fn get_agent_events(token: AgentToken) -> ApiResponse(List(AgentEvent)) { - let request = api.get(AgentAuth(token), "/my/agent/events") - use response <- api.try_send(request) - case response.status { - 200 -> api.parse_data_response(response, decode.list(agent_event.decoder())) - _ -> api.parse_error_response(response) - } -} diff --git a/src/spacetraders_sdk/endpoints/contracts.gleam b/src/spacetraders_sdk/endpoints/contracts.gleam deleted file mode 100644 index e2498bd..0000000 --- a/src/spacetraders_sdk/endpoints/contracts.gleam +++ /dev/null @@ -1,127 +0,0 @@ -import gleam/dynamic/decode -import gleam/json -import gleam/option.{type Option} -import spacetraders_sdk/endpoints/fleet -import spacetraders_sdk/models/agent.{type Agent} -import spacetraders_sdk/models/contract.{type Contract} -import spacetraders_sdk/models/contract_id.{type ContractId} -import spacetraders_sdk/models/ship_cargo.{type ShipCargo} -import spacetraders_sdk/models/ship_symbol.{type ShipSymbol} -import spacetraders_sdk/models/trade_symbol.{type TradeSymbol} -import spacetraders_sdk/utils/api.{type ApiResponse, type PagedData} -import spacetraders_sdk/utils/auth.{type AgentToken, AgentAuth} - -pub fn list_contracts( - token: AgentToken, - page: Option(Int), - limit: Option(Int), -) -> ApiResponse(PagedData(List(Contract))) { - let request = api.get_page(AgentAuth(token), "/my/contracts", page, limit) - use response <- api.try_send(request) - case response.status { - 200 -> - api.parse_paged_data_response(response, decode.list(contract.decoder())) - _ -> api.parse_error_response(response) - } -} - -pub fn get_contract( - token: AgentToken, - contract_id: ContractId, -) -> ApiResponse(Contract) { - let request = - api.get( - AgentAuth(token), - "/my/contracts/" <> contract_id.to_string(contract_id), - ) - use response <- api.try_send(request) - case response.status { - 200 -> api.parse_data_response(response, contract.decoder()) - _ -> api.parse_error_response(response) - } -} - -pub type ContractAccepted { - ContractAccepted(contract: Contract, agent: Agent) -} - -pub fn accept_contract( - token: AgentToken, - contract_id: ContractId, -) -> ApiResponse(ContractAccepted) { - let request = - api.post( - AgentAuth(token), - "/my/contracts/" <> contract_id.to_string(contract_id) <> "/accept", - ) - use response <- api.try_send(request) - case response.status { - 200 -> - api.parse_data_response(response, { - use contract <- decode.field("contract", contract.decoder()) - use agent <- decode.field("agent", agent.decoder()) - decode.success(ContractAccepted(contract:, agent:)) - }) - _ -> api.parse_error_response(response) - } -} - -pub type ContractFulfilled { - ContractFulfilled(contract: Contract, agent: Agent) -} - -pub fn fulfill_contract( - token: AgentToken, - contract_id: ContractId, -) -> ApiResponse(ContractFulfilled) { - let request = - api.post( - AgentAuth(token), - "/my/contracts/" <> contract_id.to_string(contract_id) <> "/fulfill", - ) - use response <- api.try_send(request) - case response.status { - 200 -> - api.parse_data_response(response, { - use contract <- decode.field("contract", contract.decoder()) - use agent <- decode.field("agent", agent.decoder()) - decode.success(ContractFulfilled(contract:, agent:)) - }) - _ -> api.parse_error_response(response) - } -} - -pub type ContractCargoDelivered { - ContractCargoDelivered(contract: Contract, cargo: ShipCargo) -} - -pub fn deliver_contract_cargo( - token: AgentToken, - contract_id: ContractId, - ship_symbol: ShipSymbol, - trade_symbol: TradeSymbol, - units: Int, -) -> ApiResponse(ContractCargoDelivered) { - let request = - api.post_json( - AgentAuth(token), - "/my/contracts/" <> contract_id.to_string(contract_id) <> "/deliver", - json.object([ - #("shipSymbol", ship_symbol.encode(ship_symbol)), - #("tradeSymbol", trade_symbol.encode(trade_symbol)), - #("units", json.int(units)), - ]), - ) - use response <- api.try_send(request) - case response.status { - 200 -> - api.parse_data_response(response, { - use contract <- decode.field("contract", contract.decoder()) - use cargo <- decode.field("cargo", ship_cargo.decoder()) - decode.success(ContractCargoDelivered(contract:, cargo:)) - }) - _ -> api.parse_error_response(response) - } -} - -pub const negotiate_contract = fleet.negotiate_contract diff --git a/src/spacetraders_sdk/endpoints/data.gleam b/src/spacetraders_sdk/endpoints/data.gleam deleted file mode 100644 index 8d3b4ba..0000000 --- a/src/spacetraders_sdk/endpoints/data.gleam +++ /dev/null @@ -1,28 +0,0 @@ -import gleam/dict.{type Dict} -import gleam/dynamic/decode -import spacetraders_sdk/models/trade_symbol.{type TradeSymbol} -import spacetraders_sdk/utils/api.{type ApiResponse} -import spacetraders_sdk/utils/auth.{NoAuth} - -pub type ExportToImportMap = - Dict(TradeSymbol, List(TradeSymbol)) - -pub fn get_supply_chain() -> ApiResponse(ExportToImportMap) { - let request = api.get(NoAuth, "/market/supply-chain") - use response <- api.try_send(request) - case response.status { - 200 -> - api.parse_data_response( - response, - decode.field( - "exportToImportMap", - decode.dict( - trade_symbol.decoder(), - decode.list(trade_symbol.decoder()), - ), - decode.success, - ), - ) - _ -> api.parse_error_response(response) - } -} diff --git a/src/spacetraders_sdk/endpoints/factions.gleam b/src/spacetraders_sdk/endpoints/factions.gleam deleted file mode 100644 index 14f0eaa..0000000 --- a/src/spacetraders_sdk/endpoints/factions.gleam +++ /dev/null @@ -1,54 +0,0 @@ -import gleam/dynamic/decode -import gleam/option.{type Option} -import spacetraders_sdk/models/faction.{type Faction} -import spacetraders_sdk/models/faction_symbol.{type FactionSymbol} -import spacetraders_sdk/utils/api.{type ApiResponse, type PagedData} -import spacetraders_sdk/utils/auth.{type AgentToken, AgentAuth, NoAuth} - -pub fn list_factions( - page: Option(Int), - limit: Option(Int), -) -> ApiResponse(PagedData(List(Faction))) { - let request = api.get_page(NoAuth, "/factions", page, limit) - use response <- api.try_send(request) - case response.status { - 200 -> - api.parse_paged_data_response(response, decode.list(faction.decoder())) - _ -> api.parse_error_response(response) - } -} - -pub fn get_faction(symbol: FactionSymbol) -> ApiResponse(Faction) { - let request = - api.get(NoAuth, "/factions/" <> faction_symbol.to_string(symbol)) - use response <- api.try_send(request) - case response.status { - 200 -> api.parse_data_response(response, faction.decoder()) - _ -> api.parse_error_response(response) - } -} - -pub type FactionReputation { - FactionReputation(symbol: FactionSymbol, reputation: Int) -} - -pub fn get_my_factions( - token: AgentToken, - page: Option(Int), - limit: Option(Int), -) -> ApiResponse(PagedData(List(FactionReputation))) { - let request = api.get_page(AgentAuth(token), "/my/factions", page, limit) - use response <- api.try_send(request) - case response.status { - 200 -> - api.parse_paged_data_response( - response, - decode.list({ - use symbol <- decode.field("symbol", faction_symbol.decoder()) - use reputation <- decode.field("reputation", decode.int) - decode.success(FactionReputation(symbol:, reputation:)) - }), - ) - _ -> api.parse_error_response(response) - } -} diff --git a/src/spacetraders_sdk/endpoints/global.gleam b/src/spacetraders_sdk/endpoints/global.gleam deleted file mode 100644 index a0b2309..0000000 --- a/src/spacetraders_sdk/endpoints/global.gleam +++ /dev/null @@ -1,203 +0,0 @@ -import birl.{type Time} -import gleam/dynamic/decode.{type Decoder} -import gleam/option.{type Option} -import gleam/uri.{type Uri} -import spacetraders_sdk/models/agent_symbol.{type AgentSymbol} -import spacetraders_sdk/utils/api.{type ApiResponse} -import spacetraders_sdk/utils/auth.{NoAuth} - -pub type Stats { - Stats( - accounts: Option(Int), - agents: Int, - ships: Int, - systems: Int, - waypoints: Int, - ) -} - -fn stats_decoder() -> Decoder(Stats) { - use accounts <- decode.optional_field( - "accounts", - option.None, - decode.optional(decode.int), - ) - use agents <- decode.field("agents", decode.int) - use ships <- decode.field("ships", decode.int) - use systems <- decode.field("systems", decode.int) - use waypoints <- decode.field("waypoints", decode.int) - decode.success(Stats(accounts:, agents:, ships:, systems:, waypoints:)) -} - -pub type Health { - Health(last_market_update: Option(Time)) -} - -fn health_decoder() -> Decoder(Health) { - use last_market_update <- decode.optional_field( - "lastMarketUpdate", - option.None, - decode.optional(api.time_decoder()), - ) - decode.success(Health(last_market_update:)) -} - -pub type CreditLeaderboardEntry { - CreditLeaderboardEntry(agent_symbol: AgentSymbol, credits: Int) -} - -fn credit_leaderboard_entry_decoder() -> Decoder(CreditLeaderboardEntry) { - use agent_symbol <- decode.field("agentSymbol", agent_symbol.decoder()) - use credits <- decode.field("credits", decode.int) - decode.success(CreditLeaderboardEntry(agent_symbol:, credits:)) -} - -pub type ChartLeaderboardEntry { - ChartLeaderboardEntry(agent_symbol: AgentSymbol, chart_count: Int) -} - -fn chart_leaderboard_entry_decoder() -> Decoder(ChartLeaderboardEntry) { - use agent_symbol <- decode.field("agentSymbol", agent_symbol.decoder()) - use chart_count <- decode.field("chartCount", decode.int) - decode.success(ChartLeaderboardEntry(agent_symbol:, chart_count:)) -} - -pub type Leaderboards { - Leaderboards( - most_credits: List(CreditLeaderboardEntry), - most_submitted_charts: List(ChartLeaderboardEntry), - ) -} - -fn leaderboards_decoder() -> Decoder(Leaderboards) { - use most_credits <- decode.field( - "mostCredits", - decode.list(credit_leaderboard_entry_decoder()), - ) - use most_submitted_charts <- decode.field( - "mostSubmittedCharts", - decode.list(chart_leaderboard_entry_decoder()), - ) - decode.success(Leaderboards(most_credits:, most_submitted_charts:)) -} - -pub type ServerResets { - ServerResets(next: Time, frequency: String) -} - -fn server_resets_decoder() -> Decoder(ServerResets) { - use next <- decode.field("next", api.time_decoder()) - use frequency <- decode.field("frequency", decode.string) - decode.success(ServerResets(next:, frequency:)) -} - -pub type Announcement { - Announcement(title: String, body: String) -} - -fn announcement_decoder() -> Decoder(Announcement) { - use title <- decode.field("title", decode.string) - use body <- decode.field("body", decode.string) - decode.success(Announcement(title:, body:)) -} - -pub type Link { - Link(name: String, url: Uri) -} - -fn link_decoder() -> Decoder(Link) { - use name <- decode.field("name", decode.string) - use url <- decode.field("url", { - use value <- decode.then(decode.string) - case uri.parse(value) { - Ok(time) -> decode.success(time) - Error(Nil) -> decode.failure(uri.empty, "Uri") - } - }) - decode.success(Link(name:, url:)) -} - -pub type ServerStatus { - ServerStatus( - status: String, - version: String, - reset_date: Time, - description: String, - stats: Stats, - health: Health, - leaderboards: Leaderboards, - server_resets: ServerResets, - announcements: List(Announcement), - links: List(Link), - ) -} - -fn server_status_decoder() -> Decoder(ServerStatus) { - use status <- decode.field("status", decode.string) - use version <- decode.field("version", decode.string) - use reset_date <- decode.field("resetDate", { - use value <- decode.then(decode.string) - case birl.from_naive(value) { - Ok(time) -> decode.success(time) - Error(Nil) -> decode.failure(birl.now(), "Time") - } - }) - use description <- decode.field("description", decode.string) - use stats <- decode.field("stats", stats_decoder()) - use health <- decode.field("health", health_decoder()) - use leaderboards <- decode.field("leaderboards", leaderboards_decoder()) - use server_resets <- decode.field("serverResets", server_resets_decoder()) - use announcements <- decode.field( - "announcements", - decode.list(announcement_decoder()), - ) - use links <- decode.field("links", decode.list(link_decoder())) - decode.success(ServerStatus( - status:, - version:, - reset_date:, - description:, - stats:, - health:, - leaderboards:, - server_resets:, - announcements:, - links:, - )) -} - -pub fn get_server_status() -> ApiResponse(ServerStatus) { - let request = api.get(NoAuth, "/") - use response <- api.try_send(request) - case response.status { - 200 -> api.parse_response(response, server_status_decoder()) - _ -> api.parse_error_response(response) - } -} - -pub type ErrorCode { - ErrorCode(code: Int, name: String) -} - -fn error_code_decoder() -> Decoder(ErrorCode) { - use code <- decode.field("code", decode.int) - use name <- decode.field("name", decode.string) - decode.success(ErrorCode(code:, name:)) -} - -pub fn list_error_codes() -> ApiResponse(List(ErrorCode)) { - let request = api.get(NoAuth, "/error-codes") - use response <- api.try_send(request) - case response.status { - 200 -> - api.parse_response( - response, - decode.field( - "errorCodes", - decode.list(error_code_decoder()), - decode.success, - ), - ) - _ -> api.parse_error_response(response) - } -} diff --git a/src/spacetraders_sdk/endpoints/systems.gleam b/src/spacetraders_sdk/endpoints/systems.gleam deleted file mode 100644 index 9131159..0000000 --- a/src/spacetraders_sdk/endpoints/systems.gleam +++ /dev/null @@ -1,209 +0,0 @@ -import gleam/dynamic/decode -import gleam/json -import gleam/list -import gleam/option.{type Option} -import spacetraders_sdk/models/construction.{type Construction} -import spacetraders_sdk/models/jump_gate.{type JumpGate} -import spacetraders_sdk/models/market.{type Market} -import spacetraders_sdk/models/ship_cargo.{type ShipCargo} -import spacetraders_sdk/models/ship_symbol.{type ShipSymbol} -import spacetraders_sdk/models/shipyard.{type Shipyard} -import spacetraders_sdk/models/system.{type System} -import spacetraders_sdk/models/system_symbol.{type SystemSymbol} -import spacetraders_sdk/models/trade_symbol.{type TradeSymbol} -import spacetraders_sdk/models/waypoint.{type Waypoint} -import spacetraders_sdk/models/waypoint_symbol.{type WaypointSymbol} -import spacetraders_sdk/models/waypoint_trait_symbol.{type WaypointTraitSymbol} -import spacetraders_sdk/models/waypoint_type.{type WaypointType} -import spacetraders_sdk/utils/api.{type ApiResponse, type PagedData} -import spacetraders_sdk/utils/auth.{NoAuth} - -pub fn list_systems( - page: Option(Int), - limit: Option(Int), -) -> ApiResponse(PagedData(List(System))) { - let request = api.get_page(NoAuth, "/systems", page, limit) - use response <- api.try_send(request) - case response.status { - 200 -> - api.parse_paged_data_response(response, decode.list(system.decoder())) - _ -> api.parse_error_response(response) - } -} - -pub fn get_system(system_symbol: SystemSymbol) -> ApiResponse(System) { - let request = - api.get(NoAuth, "/systems/" <> system_symbol.to_string(system_symbol)) - use response <- api.try_send(request) - case response.status { - 200 -> api.parse_data_response(response, system.decoder()) - _ -> api.parse_error_response(response) - } -} - -pub fn list_system_waypoints( - system_symbol: SystemSymbol, - page: Option(Int), - limit: Option(Int), - type_: Option(WaypointType), - traits: List(WaypointTraitSymbol), -) -> ApiResponse(PagedData(List(Waypoint))) { - let query = - list.map(traits, fn(trait) { - #("traits", waypoint_trait_symbol.to_string(trait)) - }) - let query = case type_ { - option.Some(type_) -> [#("type", waypoint_type.to_string(type_)), ..query] - option.None -> query - } - let request = - api.get_page_with_query( - NoAuth, - "/systems/" <> system_symbol.to_string(system_symbol) <> "/waypoints", - page, - limit, - query, - ) - use response <- api.try_send(request) - case response.status { - 200 -> - api.parse_paged_data_response(response, decode.list(waypoint.decoder())) - _ -> api.parse_error_response(response) - } -} - -pub fn get_waypoint( - system_symbol: SystemSymbol, - waypoint_symbol: WaypointSymbol, -) -> ApiResponse(Waypoint) { - let request = - api.get( - NoAuth, - "/systems/" - <> system_symbol.to_string(system_symbol) - <> "/waypoints/" - <> waypoint_symbol.to_string(waypoint_symbol), - ) - use response <- api.try_send(request) - case response.status { - 200 -> api.parse_data_response(response, waypoint.decoder()) - _ -> api.parse_error_response(response) - } -} - -pub fn get_construction_site( - system_symbol: SystemSymbol, - waypoint_symbol: WaypointSymbol, -) -> ApiResponse(Construction) { - let request = - api.get( - NoAuth, - "/systems/" - <> system_symbol.to_string(system_symbol) - <> "/waypoints/" - <> waypoint_symbol.to_string(waypoint_symbol) - <> "/construction", - ) - use response <- api.try_send(request) - case response.status { - 200 -> api.parse_data_response(response, construction.decoder()) - _ -> api.parse_error_response(response) - } -} - -pub type ConstructionSiteSupplied { - ConstructionSiteSupplied(construction: Construction, cargo: ShipCargo) -} - -pub fn supply_construction_site( - system_symbol: SystemSymbol, - waypoint_symbol: WaypointSymbol, - ship_symbol: ShipSymbol, - trade_symbol: TradeSymbol, - units: Int, -) -> ApiResponse(ConstructionSiteSupplied) { - let request = - api.post_json( - NoAuth, - "/systems/" - <> system_symbol.to_string(system_symbol) - <> "/waypoints/" - <> waypoint_symbol.to_string(waypoint_symbol) - <> "/construction/supply", - json.object([ - #("shipSymbol", ship_symbol.encode(ship_symbol)), - #("tradeSymbol", trade_symbol.encode(trade_symbol)), - #("units", json.int(units)), - ]), - ) - use response <- api.try_send(request) - case response.status { - 201 -> - api.parse_data_response(response, { - use construction <- decode.field("construction", construction.decoder()) - use cargo <- decode.field("cargo", ship_cargo.decoder()) - decode.success(ConstructionSiteSupplied(construction:, cargo:)) - }) - _ -> api.parse_error_response(response) - } -} - -pub fn get_market( - system_symbol: SystemSymbol, - waypoint_symbol: WaypointSymbol, -) -> ApiResponse(Market) { - let request = - api.get( - NoAuth, - "/systems/" - <> system_symbol.to_string(system_symbol) - <> "/waypoints/" - <> waypoint_symbol.to_string(waypoint_symbol) - <> "/market", - ) - use response <- api.try_send(request) - case response.status { - 200 -> api.parse_data_response(response, market.decoder()) - _ -> api.parse_error_response(response) - } -} - -pub fn get_jump_gate( - system_symbol: SystemSymbol, - waypoint_symbol: WaypointSymbol, -) -> ApiResponse(JumpGate) { - let request = - api.get( - NoAuth, - "/systems/" - <> system_symbol.to_string(system_symbol) - <> "/waypoints/" - <> waypoint_symbol.to_string(waypoint_symbol) - <> "/jump-gate", - ) - use response <- api.try_send(request) - case response.status { - 200 -> api.parse_data_response(response, jump_gate.decoder()) - _ -> api.parse_error_response(response) - } -} - -pub fn get_shipyard( - system_symbol: SystemSymbol, - waypoint_symbol: WaypointSymbol, -) -> ApiResponse(Shipyard) { - let request = - api.get( - NoAuth, - "/systems/" - <> system_symbol.to_string(system_symbol) - <> "/waypoints/" - <> waypoint_symbol.to_string(waypoint_symbol) - <> "/shipyard", - ) - use response <- api.try_send(request) - case response.status { - 200 -> api.parse_data_response(response, shipyard.decoder()) - _ -> api.parse_error_response(response) - } -} diff --git a/src/spacetraders_sdk/utils/api.gleam b/src/spacetraders_sdk/internal/api.gleam similarity index 67% rename from src/spacetraders_sdk/utils/api.gleam rename to src/spacetraders_sdk/internal/api.gleam index 3993d50..e8da1ac 100644 --- a/src/spacetraders_sdk/utils/api.gleam +++ b/src/spacetraders_sdk/internal/api.gleam @@ -1,4 +1,3 @@ -import birl.{type Time} import gleam/bit_array import gleam/dynamic.{type Dynamic} import gleam/dynamic/decode.{type Decoder} @@ -11,12 +10,8 @@ import gleam/json.{type DecodeError, type Json} import gleam/option.{type Option} import gleam/result import gleam/string_tree -import spacetraders_sdk/models/meta.{type Meta} -import spacetraders_sdk/utils/auth.{type AuthMethod} - -pub type PagedData(data) { - PagedData(data: data, meta: Meta) -} +import spacetraders_models/meta.{type Meta} +import spacetraders_sdk/internal/jwt pub type ErrorResponse { ErrorResponse( @@ -36,6 +31,71 @@ pub type ApiError { pub type ApiResponse(a) = Result(a, ApiError) +pub type PagedData(data) { + PagedData(data: data, meta: Meta) +} + +pub opaque type AccountToken { + AccountToken(token: String) +} + +pub opaque type AgentToken { + AgentToken(token: String) +} + +pub type TokenParseError { + InvalidToken + IncorrectType +} + +pub type AuthMethod { + AccountAuth(AccountToken) + AgentAuth(AgentToken) + NoAuth +} + +pub fn parse_account_token( + value: String, +) -> Result(AccountToken, TokenParseError) { + use jwt <- result.try(jwt.parse(value) |> result.replace_error(InvalidToken)) + case jwt.payload.subject { + "account-token" -> Ok(AccountToken(value)) + _ -> Error(IncorrectType) + } +} + +pub fn account_token_decoder() -> Decoder(AccountToken) { + use value <- decode.then(decode.string) + case parse_account_token(value) { + Ok(token) -> decode.success(token) + Error(_) -> decode.failure(AccountToken("invalid"), "AccountToken") + } +} + +pub fn parse_agent_token(value: String) -> Result(AgentToken, TokenParseError) { + use jwt <- result.try(jwt.parse(value) |> result.replace_error(InvalidToken)) + case jwt.payload.subject { + "agent-token" -> Ok(AgentToken(value)) + _ -> Error(IncorrectType) + } +} + +pub fn agent_token_decoder() -> Decoder(AgentToken) { + use value <- decode.then(decode.string) + case parse_agent_token(value) { + Ok(token) -> decode.success(token) + Error(_) -> decode.failure(AgentToken("invalid"), "AgentToken") + } +} + +fn set_auth(req: Request(a), auth_method: AuthMethod) -> Request(a) { + case auth_method { + NoAuth -> req + AccountAuth(AccountToken(token)) | AgentAuth(AgentToken(token)) -> + req |> request.set_header("Authorization", "Bearer " <> token) + } +} + const base_request = request.Request( method: http.Get, headers: [], @@ -51,7 +111,7 @@ fn set_body( req: request.Request(a), content_type: String, body: BitArray, -) -> request.Request(BitArray) { +) -> Request(BitArray) { req |> request.set_header("Content-Type", content_type) |> request.set_body(body) @@ -75,7 +135,7 @@ fn set_json_body(req: Request(a), json: Json) { fn make_request(method: Method, auth_method: AuthMethod, path: String) { base_request |> request.set_method(method) - |> auth.set_auth(auth_method) + |> set_auth(auth_method) |> request.set_path(base_request.path <> path) } @@ -124,48 +184,72 @@ pub fn get_page_with_query( page: Option(Int), limit: Option(Int), query: List(#(String, String)), -) { +) -> Request(BitArray) { make_request(http.Get, auth_method, path) |> request.set_query(page_query_params(query, page, limit)) } -pub fn post(auth_method: AuthMethod, path: String) { +pub fn post(auth_method: AuthMethod, path: String) -> Request(BitArray) { make_request(http.Post, auth_method, path) } -pub fn post_text(auth_method: AuthMethod, path: String, body: String) { +pub fn post_text( + auth_method: AuthMethod, + path: String, + body: String, +) -> Request(BitArray) { make_request(http.Post, auth_method, path) |> set_text_body(body) } -pub fn post_json(auth_method: AuthMethod, path: String, body: Json) { +pub fn post_json( + auth_method: AuthMethod, + path: String, + body: Json, +) -> Request(BitArray) { make_request(http.Post, auth_method, path) |> set_json_body(body) } -pub fn patch(auth_method: AuthMethod, path: String) { +pub fn patch(auth_method: AuthMethod, path: String) -> Request(BitArray) { make_request(http.Patch, auth_method, path) } -pub fn patch_text(auth_method: AuthMethod, path: String, body: String) { +pub fn patch_text( + auth_method: AuthMethod, + path: String, + body: String, +) -> Request(BitArray) { make_request(http.Patch, auth_method, path) |> set_text_body(body) } -pub fn patch_json(auth_method: AuthMethod, path: String, body: Json) { +pub fn patch_json( + auth_method: AuthMethod, + path: String, + body: Json, +) -> Request(BitArray) { make_request(http.Patch, auth_method, path) |> set_json_body(body) } -pub fn put(auth_method: AuthMethod, path: String) { +pub fn put(auth_method: AuthMethod, path: String) -> Request(BitArray) { make_request(http.Put, auth_method, path) } -pub fn put_text(auth_method: AuthMethod, path: String, body: String) { +pub fn put_text( + auth_method: AuthMethod, + path: String, + body: String, +) -> Request(BitArray) { make_request(http.Put, auth_method, path) |> set_text_body(body) } -pub fn put_json(auth_method: AuthMethod, path: String, body: Json) { +pub fn put_json( + auth_method: AuthMethod, + path: String, + body: Json, +) -> Request(BitArray) { make_request(http.Put, auth_method, path) |> set_json_body(body) } -pub fn delete(auth_method: AuthMethod, path: String) { +pub fn delete(auth_method: AuthMethod, path: String) -> Request(BitArray) { make_request(http.Delete, auth_method, path) } @@ -245,11 +329,3 @@ pub fn parse_error_response(response: Response(BitArray)) -> ApiResponse(data) { Error(err) -> err }) } - -pub fn time_decoder() -> Decoder(Time) { - use value <- decode.then(decode.string) - case birl.parse(value) { - Ok(time) -> decode.success(time) - Error(Nil) -> decode.failure(birl.now(), "Time") - } -} diff --git a/src/spacetraders_sdk/utils/jwt.gleam b/src/spacetraders_sdk/internal/jwt.gleam similarity index 93% rename from src/spacetraders_sdk/utils/jwt.gleam rename to src/spacetraders_sdk/internal/jwt.gleam index e4bc584..94d36eb 100644 --- a/src/spacetraders_sdk/utils/jwt.gleam +++ b/src/spacetraders_sdk/internal/jwt.gleam @@ -5,6 +5,7 @@ import gleam/json import gleam/option.{type Option} import gleam/result import gleam/string +import spacetraders_sdk/internal/time pub type JwtDecodeError { MissingHeader @@ -89,13 +90,7 @@ fn jwt_payload_decoder() -> Decoder(JwtPayload) { use reset_date <- decode.optional_field( "reset_date", option.None, - decode.optional({ - use value <- decode.then(decode.string) - case birl.from_naive(value) { - Ok(time) -> decode.success(time) - Error(Nil) -> decode.failure(birl.now(), "Time") - } - }), + decode.optional(time.date_decoder()), ) use issued_at_int <- decode.field("iat", decode.int) let issued_at = birl.from_unix(issued_at_int) diff --git a/src/spacetraders_sdk/internal/time.gleam b/src/spacetraders_sdk/internal/time.gleam new file mode 100644 index 0000000..43bf3ea --- /dev/null +++ b/src/spacetraders_sdk/internal/time.gleam @@ -0,0 +1,18 @@ +import birl.{type Time} +import gleam/dynamic/decode.{type Decoder} + +pub fn datetime_decoder() -> Decoder(Time) { + use value <- decode.then(decode.string) + case birl.parse(value) { + Ok(time) -> decode.success(time) + Error(Nil) -> decode.failure(birl.now(), "DateTime") + } +} + +pub fn date_decoder() -> Decoder(Time) { + use value <- decode.then(decode.string) + case birl.from_naive(value) { + Ok(time) -> decode.success(time) + Error(Nil) -> decode.failure(birl.now(), "Date") + } +} diff --git a/src/spacetraders_sdk/utils/auth.gleam b/src/spacetraders_sdk/utils/auth.gleam deleted file mode 100644 index e4863d1..0000000 --- a/src/spacetraders_sdk/utils/auth.gleam +++ /dev/null @@ -1,65 +0,0 @@ -import gleam/dynamic/decode.{type Decoder} -import gleam/http/request.{type Request} -import gleam/result -import spacetraders_sdk/utils/jwt - -pub opaque type AccountToken { - AccountToken(token: String) -} - -pub opaque type AgentToken { - AgentToken(token: String) -} - -pub type TokenParseError { - InvalidToken - IncorrectType -} - -pub fn parse_account_token( - value: String, -) -> Result(AccountToken, TokenParseError) { - use jwt <- result.try(jwt.parse(value) |> result.replace_error(InvalidToken)) - case jwt.payload.subject { - "account-token" -> Ok(AccountToken(value)) - _ -> Error(IncorrectType) - } -} - -pub fn account_token_decoder() -> Decoder(AccountToken) { - use value <- decode.then(decode.string) - case parse_account_token(value) { - Ok(token) -> decode.success(token) - Error(_) -> decode.failure(AccountToken("invalid"), "AccountToken") - } -} - -pub fn parse_agent_token(value: String) -> Result(AgentToken, TokenParseError) { - use jwt <- result.try(jwt.parse(value) |> result.replace_error(InvalidToken)) - case jwt.payload.subject { - "agent-token" -> Ok(AgentToken(value)) - _ -> Error(IncorrectType) - } -} - -pub fn agent_token_decoder() -> Decoder(AgentToken) { - use value <- decode.then(decode.string) - case parse_agent_token(value) { - Ok(token) -> decode.success(token) - Error(_) -> decode.failure(AgentToken("invalid"), "AgentToken") - } -} - -pub type AuthMethod { - AccountAuth(AccountToken) - AgentAuth(AgentToken) - NoAuth -} - -pub fn set_auth(req: Request(a), auth_method: AuthMethod) -> Request(a) { - case auth_method { - NoAuth -> req - AccountAuth(AccountToken(token)) | AgentAuth(AgentToken(token)) -> - req |> request.set_header("Authorization", "Bearer " <> token) - } -} diff --git a/test/spacetraders_sdk_test.gleam b/test/spacetraders_sdk_test.gleam index 9a9211d..b8d1f1f 100644 --- a/test/spacetraders_sdk_test.gleam +++ b/test/spacetraders_sdk_test.gleam @@ -1,7 +1,5 @@ import gleeunit -import spacetraders_sdk/endpoints/accounts -import spacetraders_sdk/endpoints/data -import spacetraders_sdk/endpoints/global +import spacetraders_api import spacetraders_sdk_test/env pub fn main() -> Nil { @@ -9,17 +7,18 @@ pub fn main() -> Nil { } pub fn status_test() { - let assert Ok(_) = global.get_server_status() + let assert Ok(_) = spacetraders_api.get_server_status() } pub fn error_codes_test() { - let assert Ok(_) = global.list_error_codes() + let assert Ok(_) = spacetraders_api.list_error_codes() } pub fn account_test() { - let assert Ok(_) = accounts.get_account(env.load_dotenv_unsafe().agent_token) + let assert Ok(_) = + spacetraders_api.get_account(env.load_dotenv_unsafe().agent_token) } pub fn supply_chain_test() { - let assert Ok(_) = data.get_supply_chain() + let assert Ok(_) = spacetraders_api.get_supply_chain() } diff --git a/test/spacetraders_sdk_test/env.gleam b/test/spacetraders_sdk_test/env.gleam index 019fe2f..5c342ba 100644 --- a/test/spacetraders_sdk_test/env.gleam +++ b/test/spacetraders_sdk_test/env.gleam @@ -1,7 +1,7 @@ import dot_env import dot_env/env import gleam/result -import spacetraders_sdk/utils/auth.{type AccountToken, type AgentToken} +import spacetraders_sdk.{type AccountToken, type AgentToken} pub type Env { Env(account_token: AccountToken, agent_token: AgentToken) @@ -16,7 +16,7 @@ pub fn get_account_token() -> Result(AccountToken, EnvError) { env.get_string("ACCOUNT_TOKEN") |> result.replace_error(MissingVar("ACCOUNT_TOKEN")) |> result.then(fn(value) { - auth.parse_account_token(value) + spacetraders_sdk.parse_account_token(value) |> result.replace_error(InvalidVar("ACCOUNT_TOKEN")) }) } @@ -25,7 +25,7 @@ pub fn get_agent_token() -> Result(AgentToken, EnvError) { env.get_string("AGENT_TOKEN") |> result.replace_error(MissingVar("AGENT_TOKEN")) |> result.then(fn(value) { - auth.parse_agent_token(value) + spacetraders_sdk.parse_agent_token(value) |> result.replace_error(InvalidVar("AGENT_TOKEN")) }) }