31 lines
863 B
Gleam
31 lines
863 B
Gleam
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
|
|
}
|