import gleam/dynamic/decode.{type Decoder} import gleam/result import spacetraders_models/internal/jwt import spacetraders_models/token_parse_error.{ type TokenParseError, IncorrectType, InvalidToken, } pub opaque type AccountToken { AccountToken(String) } pub fn parse(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 decoder() -> Decoder(AccountToken) { use value <- decode.then(decode.string) case parse(value) { Ok(token) -> decode.success(token) Error(_) -> decode.failure(AccountToken("invalid"), "AccountToken") } } pub fn to_string(account_token: AccountToken) -> String { let AccountToken(value) = account_token value }