Advertisement
Guest User

Untitled

a guest
Sep 23rd, 2013
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module VersionOne.CommandLine
  2.  
  3. module ArgParse =
  4.  
  5.   type FlagFuncs<'T> = Map<string, ('T -> 'T)>
  6.  type ValueFuncs<'T> = Map<string, ('T -> string -> 'T)>
  7.   type BareFunc<'T> = 'T -> string ->  'T
  8.  
  9.  type OptionsDefinition<'T> = {
  10.     initialState : 'T
  11.    flagFuncs : FlagFuncs<'T>
  12.     valueFuncs : ValueFuncs<'T>
  13.    bareFunc : BareFunc<'T>
  14.     }
  15.  
  16.   let rec parseArgs' (def:OptionsDefinition<'T>) state = function
  17.     | flag        :: tail when def.flagFuncs.ContainsKey flag  -> parseArgs' def (def.flagFuncs.[flag] state) tail
  18.    | flag :: arg :: tail when def.valueFuncs.ContainsKey flag -> parseArgs' def (def.valueFuncs.[flag] state arg) tail
  19.     |         arg :: tail                                      -> parseArgs' def (def.bareFunc state arg) tail
  20.    | []                                                       -> state
  21.  
  22.  let fromDefinition def argv = parseArgs' def def.initialState (List.ofArray argv)
  23.  
  24.  
  25. module Main =
  26.  
  27.   type Options = {
  28.     creds : string
  29.     secrets : string
  30.     outputs : string list
  31.     }
  32.  
  33.   let parseOpts = ArgParse.fromDefinition {
  34.     initialState =
  35.       { creds = "stored_credentials.json"
  36.         secrets = "client_secrets.json"
  37.         outputs = []  }
  38.     bareFunc =       fun opts v -> {opts with outputs = v :: opts.outputs }
  39.     flagFuncs  =
  40.       Map [
  41.         "-h",        fun opts   -> failwith "Would display help here"
  42.         ]
  43.     valueFuncs =
  44.       Map [
  45.         "--creds",   fun opts v -> {opts with creds = v}
  46.         "--secrets", fun opts v -> {opts with secrets = v}
  47.         ]
  48.     }
  49.  
  50.   [<EntryPoint>]
  51.   let main argv =
  52.     let opts = parseOpts argv
  53.     printfn "%A" opts
  54.     0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement