0 | module Pack.CmdLn.Completion
2 | import Control.Monad.Trans
4 | import Data.SortedMap
5 | import Libraries.Data.List.Extra
10 | import Pack.Runner.Query
11 | import System.Directory
18 | ipkgFiles : HasIO io => io (List String)
20 | Right ss <- runEitherT currentEntries | Left _ => pure []
21 | pure . map interpolate $
filter isIpkgBody ss
23 | toDBName : Body -> Maybe String
24 | toDBName s = case split s of
25 | Just (db,"toml") => Just "\{db}"
29 | collections : HasIO io => Env => io (List String)
31 | Right ss <- runEitherT (entries dbDir) | Left _ => pure []
32 | pure $
mapMaybe toDBName ss
36 | packages : (e : Env) => List String
37 | packages = value <$> keys e.all
41 | packagesOrIpkg : HasIO io => Env => io (List String)
44 | pure (packages ++ ps)
46 | all : HasIO io => Env => io (List QPkg)
48 | ei <- runEitherT $
resolveAll
49 | pure $
either (const []) snd ei
52 | installedLibs : HasIO io => Env => io (List String)
53 | installedLibs = map nameStr . filter installedLib <$> all
56 | installedApps : HasIO io => Env => io (List String)
57 | installedApps = map nameStr . filter installedApp <$> all
60 | apps : HasIO io => Env => io (List String)
61 | apps = map nameStr . filter isApp <$> all
64 | prefixOnly : String -> List String -> List String
65 | prefixOnly x = sortedNub . filter (\s => x /= s && isPrefixOf x s)
69 | prefixOnlyIfNonEmpty : String -> List String -> List String
70 | prefixOnlyIfNonEmpty "--" = id
71 | prefixOnlyIfNonEmpty s = prefixOnly s
74 | packageTypes : List String
75 | packageTypes = map interpolate [PLib, PApp]
77 | packageList : String -> List String -> List String
78 | packageList "--" xs = xs
79 | packageList s xs = case reverse $
split (',' ==) s of
80 | h ::: _ => prefixOnly h xs
82 | codegens : List String
94 | commands : List String
95 | commands = map fst Types.namesAndCommands
97 | optionFlags : List String
98 | optionFlags = commands ++ optionNames
100 | queries : Env => List String
101 | queries = ["dep", "module"] ++ packages
108 | opts : HasIO io => Env => String -> String -> io (List String)
109 | opts "--" "pack" = pure optionFlags
112 | opts x "--package-set" = prefixOnlyIfNonEmpty x <$> collections
113 | opts x "--with-ipkg" = prefixOnlyIfNonEmpty x <$> ipkgFiles
114 | opts x "-p" = prefixOnlyIfNonEmpty x <$> collections
115 | opts x "-P" = prefixOnlyIfNonEmpty x <$> pure packages
116 | opts x "--packages" = prefixOnlyIfNonEmpty x <$> pure packages
117 | opts x "--cg" = prefixOnlyIfNonEmpty x <$> pure codegens
118 | opts x "--log-level" = prefixOnlyIfNonEmpty x <$> pure (fst <$> logLevels)
121 | opts x "app-path" = prefixOnlyIfNonEmpty x <$> installedApps
122 | opts x "build" = prefixOnlyIfNonEmpty x <$> ipkgFiles
123 | opts x "install-deps" = prefixOnlyIfNonEmpty x <$> ipkgFiles
124 | opts x "query" = prefixOnlyIfNonEmpty x <$> pure queries
125 | opts x "fuzzy" = packageList x <$> installedLibs
126 | opts x "dep" = prefixOnlyIfNonEmpty x <$> pure packages
127 | opts x "modules" = prefixOnlyIfNonEmpty x <$> pure packages
128 | opts x "check-db" = prefixOnlyIfNonEmpty x <$> collections
129 | opts x "run" = prefixOnlyIfNonEmpty x <$> packagesOrIpkg
130 | opts x "install" = prefixOnlyIfNonEmpty x <$> pure packages
131 | opts x "test" = prefixOnlyIfNonEmpty x <$> pure packages
132 | opts x "install-app" = prefixOnlyIfNonEmpty x <$> apps
133 | opts x "remove" = prefixOnlyIfNonEmpty x <$> installedLibs
134 | opts x "remove-app" = prefixOnlyIfNonEmpty x <$> installedApps
135 | opts x "switch" = prefixOnlyIfNonEmpty x . ("latest" ::)
137 | opts x "clean" = prefixOnlyIfNonEmpty x <$> ipkgFiles
138 | opts x "typecheck" = prefixOnlyIfNonEmpty x <$> ipkgFiles
139 | opts x "new" = prefixOnlyIfNonEmpty x <$> pure packageTypes
140 | opts x "uninstall" = pure Nil
141 | opts x "help" = prefixOnlyIfNonEmpty x <$> pure commands
145 | if (x `elem` optionFlags)
149 | else prefixOnly x optionFlags
154 | complete : HasIO io => String -> String -> Env -> EitherT PackErr io ()
155 | complete a b e = do
156 | os <- lift $
opts a b
157 | putStr $
unlines os
161 | completionScript : (fun : String) -> String
162 | completionScript fun = let fun' = "_" ++ fun in """
165 | ED=$([ -z $2 ] && echo "--" || echo $2)
166 | COMPREPLY=($(pack completion $ED $3))
169 | complete -F \{ fun' } -o default pack