Files
puregym-unofficial-dotnet/PureGym.App/Authenticate.fs
2023-12-27 20:21:08 +00:00

62 lines
2.0 KiB
Forth

namespace PureGym.App
open Argu
open System
open PureGym
type GetTokenArg =
| [<Unique ; EqualsAssignmentOrSpaced>] User_Email of string
| [<Unique ; EqualsAssignmentOrSpaced>] Pin of string
| [<Unique>] StdIn
interface IArgParserTemplate with
member s.Usage =
match s with
| GetTokenArg.Pin _ -> "Eight-digit PureGym user's PIN"
| GetTokenArg.User_Email _ -> "PureGym user's email address"
| GetTokenArg.StdIn -> "Read anything not specified on the command line from stdin"
static member Parse (args : ParseResults<GetTokenArg>) : Result<UsernamePin, ArguParseException> =
let canUseStdin = args.TryGetResult(GetTokenArg.StdIn).IsSome
let username =
match args.TryGetResult GetTokenArg.User_Email, canUseStdin with
| None, true ->
Console.Error.Write "Enter username: "
Console.ReadLine ()
| None, false ->
// TODO: proper exception handling, this should be surfaced through the Error
failwith "You must supply --user-email or --stdin"
| Some s, _ -> s
let pin =
match args.TryGetResult GetTokenArg.Pin, canUseStdin with
| None, true ->
Console.Error.Write "Enter eight-digit PIN: "
Console.ReadLine ()
| None, false ->
// TODO: proper exception handling, this should be surfaced through the Error
failwith "You must supply --pin or --stdin"
| Some s, _ -> s
{
Username = username
Pin = pin
}
|> Ok
[<RequireQualifiedAccess>]
module Authenticate =
let run (creds : UsernamePin) =
task {
let! cred = AuthToken.get creds
Console.WriteLine cred.AccessToken
match cred.ExpiryTime with
| None -> ()
| Some expiry -> Console.Error.WriteLine $"Expires at {expiry}"
return 0
}