namespace PureGym.App open System.Threading open Argu open System open PureGym type GetTokenArg = | [] User_Email of string | [] Pin of string | [] 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) : Result = 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 [] module Authenticate = let run (creds : UsernamePin) = task { let! cred = AuthToken.get creds CancellationToken.None Console.WriteLine cred.AccessToken match cred.ExpiryTime with | None -> () | Some expiry -> Console.Error.WriteLine $"Expires at {expiry}" return 0 }