gleam-spacetraders-sdk/src/utils/auth.gleam
Lily Rose 64f3729d0c
Some checks are pending
test / test (push) Waiting to run
Refactoring and general tidying up
2025-06-17 19:04:29 +10:00

65 lines
1.7 KiB
Gleam

import gleam/dynamic/decode.{type Decoder}
import gleam/http/request.{type Request}
import gleam/result
import 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)
}
}