forked from GitHub/gf-core
74 lines
1.5 KiB
Haskell
74 lines
1.5 KiB
Haskell
module GF.Command.Abstract where
|
|
|
|
import PGF.CId
|
|
import PGF.Data
|
|
|
|
type Ident = String
|
|
|
|
type CommandLine = [Pipe]
|
|
|
|
type Pipe = [Command]
|
|
|
|
data Command
|
|
= Command Ident [Option] Argument
|
|
deriving (Eq,Ord,Show)
|
|
|
|
data Option
|
|
= OOpt Ident
|
|
| OFlag Ident Value
|
|
deriving (Eq,Ord,Show)
|
|
|
|
data Value
|
|
= VId Ident
|
|
| VInt Int
|
|
| VStr String
|
|
deriving (Eq,Ord,Show)
|
|
|
|
data Argument
|
|
= ATree Tree
|
|
| ANoArg
|
|
| AMacro Ident
|
|
deriving (Eq,Ord,Show)
|
|
|
|
valCIdOpts :: String -> CId -> [Option] -> CId
|
|
valCIdOpts flag def opts =
|
|
case [v | OFlag f (VId v) <- opts, f == flag] of
|
|
(v:_) -> mkCId v
|
|
_ -> def
|
|
|
|
valIntOpts :: String -> Int -> [Option] -> Int
|
|
valIntOpts flag def opts =
|
|
case [v | OFlag f (VInt v) <- opts, f == flag] of
|
|
(v:_) -> v
|
|
_ -> def
|
|
|
|
valStrOpts :: String -> String -> [Option] -> String
|
|
valStrOpts flag def opts =
|
|
case [v | OFlag f v <- opts, f == flag] of
|
|
(VStr v:_) -> v
|
|
(VId v:_) -> v
|
|
(VInt v:_) -> show v
|
|
_ -> def
|
|
|
|
isOpt :: String -> [Option] -> Bool
|
|
isOpt o opts = elem o [x | OOpt x <- opts]
|
|
|
|
isFlag :: String -> [Option] -> Bool
|
|
isFlag o opts = elem o [x | OFlag x _ <- opts]
|
|
|
|
prOpt :: Option -> String
|
|
prOpt o = case o of
|
|
OOpt i -> i
|
|
OFlag f x -> f ++ "=" ++ show x
|
|
|
|
mkOpt :: String -> Option
|
|
mkOpt = OOpt
|
|
|
|
-- abbreviation convention from gf commands
|
|
getCommandOp s = case break (=='_') s of
|
|
(a:_,_:b:_) -> [a,b] -- axx_byy --> ab
|
|
_ -> case s of
|
|
[a,b] -> s -- ab --> ab
|
|
a:_ -> [a] -- axx --> a
|
|
|