Files
puregym-unofficial-dotnet/PureGym.App/Authenticate.fs
Smaug123 f5a6a6644c
Some checks failed
ci/woodpecker/push/build Pipeline was successful
ci/woodpecker/push/all-checks-complete Pipeline was successful
ci/woodpecker/pr/build Pipeline failed
ci/woodpecker/pr/all-checks-complete unknown status
Better semantics for MemberActivity
2023-10-14 17:29:15 +01: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
}