0 | module Pack.Config.Types
2 | import Control.Monad.Either
6 | import public Data.List.Quantifiers
8 | import Data.SortedMap as SM
9 | import Idris.Package.Types
10 | import Libraries.Data.List.Extra
11 | import Pack.Core.Git.Consts
12 | import Pack.Core.Types
13 | import Pack.Database.Types
21 | data Autoload : Type where
26 | Installed : Autoload
33 | AutoPkgs : List PkgName -> Autoload
37 | ForcePkgs : List PkgName -> Autoload
41 | data QueryType : Type where
43 | NameOnly : QueryType
46 | ShortDesc : QueryType
49 | Dependencies : QueryType
62 | ReverseTree : QueryType
66 | data Codegen : Type where
73 | JavaScript : Codegen
76 | Other : String -> Codegen
79 | Interpolation Codegen where
80 | interpolate Default = ""
81 | interpolate Chez = "chez"
82 | interpolate ChezSep = "chez-sep"
83 | interpolate Racket = "racket"
84 | interpolate Gambit = "gambit"
85 | interpolate Node = "node"
86 | interpolate JavaScript = "javascript"
87 | interpolate RefC = "refc"
88 | interpolate VMCode = "vmcode-interp"
89 | interpolate (Other x) = x
92 | fromString : String -> Codegen
93 | fromString "chez" = Chez
94 | fromString "chez-sep" = ChezSep
95 | fromString "racket" = Racket
96 | fromString "gambit" = Gambit
97 | fromString "node" = Node
98 | fromString "javascript" = JavaScript
99 | fromString "refc" = RefC
100 | fromString "vmcode-interp" = VMCode
101 | fromString x = Other x
111 | data WithIpkg : Type where
117 | Search : (dir : CurDir) -> WithIpkg
124 | Use : (ipkg : File Abs) -> WithIpkg
133 | data RlwrapConfig : Type where
134 | DoNotUseRlwrap : RlwrapConfig
135 | UseRlwrap : CmdArgList -> RlwrapConfig
153 | record Config_ (f : Type -> Type) (c : Type) where
154 | constructor MkConfig
156 | collection : f DBName
161 | idrisURL : Maybe URL
166 | idrisCommit : Maybe c
169 | allIdrisCommits : List c
172 | packURL : Maybe URL
175 | packCommit : Maybe c
178 | scheme : f FilePath
184 | bootstrapStage3 : f Bool
189 | safetyPrompt : f Bool
202 | warnDepends : f Bool
210 | whitelist : f (List PkgName)
223 | withIpkg : f WithIpkg
226 | rlwrap : f RlwrapConfig
229 | extraArgs : f CmdArgList
232 | autoLibs : f (List PkgName)
235 | autoApps : f (List PkgName)
238 | autoLoad : f Autoload
241 | custom : f (SortedMap DBName (SortedMap PkgName $
Package_ c))
244 | queryType : f (QueryType)
247 | logLevel : f (LogLevel)
250 | codegen : f (Codegen)
256 | levels : f (SortedMap String LogLevel)
263 | 0 IConfig : Type -> Type
264 | IConfig = Config_ I
268 | 0 MConfig : Type -> Type
269 | MConfig = Config_ Maybe
273 | 0 MetaConfig : Type
274 | MetaConfig = IConfig MetaCommit
279 | Config = IConfig Commit
283 | 0 UserConfig : Type
284 | UserConfig = MConfig MetaCommit
290 | traverse : Applicative f
291 | => (URL -> a -> f b)
292 | -> (idrisURL : URL)
295 | traverse g idrisURL cfg =
296 | let iurl = fromMaybe idrisURL cfg.idrisURL
297 | purl = fromMaybe defaultPackRepo cfg.packURL
298 | cst = traverse (traverse $
traverse g) cfg.custom
299 | ic = traverse (g iurl) cfg.idrisCommit
300 | ics = traverse (g iurl) cfg.allIdrisCommits
301 | pc = traverse (g purl) cfg.packCommit
302 | in [| adj ic ics pc cst |]
303 | where adj : (idrisCommit : Maybe b)
304 | -> (allidrisCommits : List b)
305 | -> (packCommit : Maybe b)
306 | -> SortedMap DBName (SortedMap PkgName $
Package_ b)
309 | { idrisCommit := ic
310 | , allIdrisCommits := ics
317 | export %inline %hint
318 | configToLogRef : (c : Config) => LogRef
319 | configToLogRef = MkLogRef c.logLevel
323 | export %inline %hint
324 | metaConfigToLogRef : (c : MetaConfig) => LogRef
325 | metaConfigToLogRef = MkLogRef c.logLevel
331 | export infixl 8 `mergeRight`
334 | mergeRight : SortedMap k v -> SortedMap k v -> SortedMap k v
335 | mergeRight = mergeWith (\_,v => v)
339 | init : (cur : CurDir) => (coll : DBName) -> MetaConfig
340 | init coll = MkConfig {
342 | , idrisURL = Nothing
343 | , idrisCommit = Nothing
344 | , allIdrisCommits = []
345 | , packURL = Nothing
346 | , packCommit = Nothing
347 | , scheme = "scheme"
348 | , bootstrap = False
349 | , bootstrapStage3 = True
350 | , safetyPrompt = True
353 | , warnDepends = True
354 | , skipTests = False
355 | , whitelist = ["pack", "idris2-lsp"]
359 | , withIpkg = Search cur
360 | , rlwrap = DoNotUseRlwrap
364 | , autoLoad = NoPkgs
366 | , queryType = NameOnly
367 | , logLevel = Warning
368 | , codegen = Default
369 | , output = "_tmppack"
374 | export infixl 7 `update`
378 | update : IConfig c -> MConfig c -> IConfig c
379 | update ci cm = MkConfig {
380 | collection = fromMaybe ci.collection cm.collection
381 | , idrisURL = cm.idrisURL <|> ci.idrisURL
382 | , idrisCommit = cm.idrisCommit <|> ci.idrisCommit
383 | , allIdrisCommits = cm.allIdrisCommits <+> ci.allIdrisCommits
384 | , packURL = cm.packURL <|> ci.packURL
385 | , packCommit = cm.packCommit <|> ci.packCommit
386 | , scheme = fromMaybe ci.scheme cm.scheme
387 | , bootstrap = fromMaybe ci.bootstrap cm.bootstrap
388 | , bootstrapStage3 = fromMaybe ci.bootstrapStage3 cm.bootstrapStage3
389 | , safetyPrompt = fromMaybe ci.safetyPrompt cm.safetyPrompt
390 | , gcPrompt = fromMaybe ci.gcPrompt cm.gcPrompt
391 | , gcPurge = fromMaybe ci.gcPurge cm.gcPurge
392 | , warnDepends = fromMaybe ci.warnDepends cm.warnDepends
393 | , skipTests = fromMaybe ci.skipTests cm.skipTests
394 | , withSrc = fromMaybe ci.withSrc cm.withSrc
395 | , withDocs = fromMaybe ci.withDocs cm.withDocs
396 | , useKatla = fromMaybe ci.useKatla cm.useKatla
397 | , withIpkg = fromMaybe ci.withIpkg cm.withIpkg
398 | , rlwrap = fromMaybe ci.rlwrap cm.rlwrap
399 | , extraArgs = ci.extraArgs <+> fromMaybe [] cm.extraArgs
400 | , whitelist = sortedNub (ci.whitelist ++ concat cm.whitelist)
401 | , autoLibs = sortedNub (ci.autoLibs ++ concat cm.autoLibs)
402 | , autoApps = sortedNub (ci.autoApps ++ concat cm.autoApps)
403 | , autoLoad = fromMaybe ci.autoLoad cm.autoLoad
404 | , custom = mergeWith mergeRight ci.custom (fromMaybe empty cm.custom)
405 | , queryType = fromMaybe ci.queryType cm.queryType
406 | , logLevel = fromMaybe ci.logLevel cm.logLevel
407 | , codegen = fromMaybe ci.codegen cm.codegen
408 | , output = fromMaybe ci.output cm.output
409 | , levels = mergeWith (\_,v => v) ci.levels (fromMaybe empty cm.levels)
410 | , gitInit = fromMaybe ci.gitInit cm.gitInit
420 | data HasIdris : Config -> DB -> Type where
422 | ItHasIdris : {0 c : _} -> {0 db : _} -> HasIdris c db
431 | LibCache = IORef (SortedMap PkgName $
ResolvedLib U)
435 | emptyCache : HasIO io => io LibCache
436 | emptyCache = newIORef SortedMap.empty
440 | cacheLib : HasIO io
441 | => (ref : LibCache)
444 | -> io (ResolvedLib U)
445 | cacheLib n lib = modifyIORef ref (insert n lib) $> lib
449 | lookupLib : HasIO io
450 | => (ref : LibCache)
452 | -> io (Maybe $
ResolvedLib U)
453 | lookupLib n = lookup n <$> readIORef ref
457 | uncacheLib : HasIO io => (ref : LibCache) => PkgName -> io ()
458 | uncacheLib n = modifyIORef ref (delete n)
467 | packDirs : PackDirs
472 | all : SortedMap PkgName Package
473 | linebuf : LineBufferingCmd
478 | nanoString : (e : Env) => String
479 | nanoString = show $
toNano e.clock
483 | export %inline %hint
484 | envToPackDirs : (e : Env) => PackDirs
485 | envToPackDirs = e.packDirs
489 | export %inline %hint
490 | envToTmpDir : (e : Env) => TmpDir
491 | envToTmpDir = e.tmpDir
495 | export %inline %hint
496 | envToCache : (e : Env) => LibCache
497 | envToCache = e.cache
501 | export %inline %hint
502 | envToConfig : (e : Env) => Config
503 | envToConfig = e.config
507 | export %inline %hint
508 | envToDB : (e : Env) => DB
513 | export %inline %hint
514 | envToLinebuf : (e : Env) => LineBufferingCmd
515 | envToLinebuf = e.linebuf
520 | record IdrisEnv where
521 | constructor MkIdrisEnv
524 | 0 prf : HasIdris env.config env.db
528 | export %inline %hint
529 | idrisEnvToEnv : (e : IdrisEnv) => Env
530 | idrisEnvToEnv = e.env
534 | export %inline %hint
535 | idrisEnvToTTC : (e : IdrisEnv) => TTCVersion
536 | idrisEnvToTTC = e.ttc
544 | interface Arg (0 a : Type) where
546 | readArg : List String -> Maybe (a, List String)
549 | public export %inline
550 | argDesc : (0 a : Type) -> Arg a => String
551 | argDesc a = argDesc_ {a}
555 | parseSingleMaybe : (read : String -> Maybe a)
557 | -> Maybe (a, List String)
558 | parseSingleMaybe read [] = Nothing
559 | parseSingleMaybe read (h :: t) = (,t) <$> read h
563 | parseSingle : (read : String -> Either e a)
565 | -> Maybe (a, List String)
566 | parseSingle read = parseSingleMaybe (eitherToMaybe . read)
570 | readSingle : (read : String -> a) -> List String -> Maybe (a, List String)
571 | readSingle read = parseSingleMaybe (Just . read)
574 | Arg a => Arg (Maybe a) where
575 | argDesc_ = "[\{argDesc a}]"
577 | readArg ss = case readArg {a} ss of
578 | Nothing => Just (Nothing, ss)
579 | Just (v,ss') => Just (Just v, ss')
582 | (cd : CurDir) => Arg (File Abs) where
583 | argDesc_ = "<file>"
584 | readArg = parseSingle (readAbsFile curDir)
587 | (cd : CurDir) => Arg (Path Abs) where
589 | readArg = readSingle (\s => parse s curDir)
592 | (cd : CurDir) => Arg PkgOrIpkg where
593 | argDesc_ = "<pkg or .ipkg>"
594 | readArg = readSingle $
\s => case readAbsFile curDir s of
595 | Left _ => Pkg $
MkPkgName s
597 | if isIpkgBody f.file
599 | else Pkg $
MkPkgName s
604 | readArg = readSingle MkPkgName
608 | argDesc_ = "<lib | bin>"
609 | readArg = parseSingle readPkgType
612 | Arg CmdArgList where
613 | argDesc_ = "[<args>]"
614 | readArg ss = Just (fromStrList ss, [])
617 | Arg (List PkgName) where
618 | argDesc_ = "[<pkgs>]"
619 | readArg ss = Just (map MkPkgName ss, [])
623 | argDesc_ = "<file name>"
624 | readArg = parseSingle readBody
629 | readArg = parseSingle readDBName
634 | readArg = readSingle id
653 | interface Command c where
662 | cmdName : c -> String
665 | defaultLevel : c -> LogLevel
671 | usage : Lazy String
674 | 0 ArgTypes : c -> List Type
677 | readCommand_ : String -> Maybe c
680 | readArgs : CurDir => (cmd : c) -> All Arg (ArgTypes cmd)
686 | adjConfig_ : HasIO io
690 | -> All I (ArgTypes cmd)
692 | -> EitherT PackErr io MetaConfig
694 | args : All Arg ts -> CurDir => List String -> Maybe (All I ts)
695 | args [] [] = Just []
696 | args [] (_ :: _) = Nothing
697 | args {ts = x :: xs} (p :: ps) ss = do
698 | (v,ss') <- readArg {a = x} ss
702 | argsDesc : CurDir => Command c => Maybe c -> String
703 | argsDesc Nothing = " [<args>]"
704 | argsDesc (Just x) = fastConcat $
go (readArgs x)
705 | where go : All Arg ts -> List String
706 | go = forget . mapProperty (\p => " " ++ argDesc_ @{p})
710 | usageHeader : CurDir => Command c => Maybe c -> String
712 | let nm := maybe "<cmd>" cmdName cmd
713 | in "Usage: \{appName {c}} [options] \{nm}\{argsDesc cmd}"
715 | ind : String -> String
716 | ind = unlines . map (indent 2) . lines
723 | usageDesc : CurDir => Command c => Maybe c -> String
724 | usageDesc m = case m of
741 | 0 Args : Command c => c -> Type
742 | Args cmd = All I (ArgTypes cmd)
746 | 0 CommandWithArgs : (c : Type) -> Command c => Type
747 | CommandWithArgs c = DPair c Args
749 | readCWA : Command c
753 | -> Either PackErr (CommandWithArgs c)
755 | let readers := readArgs x
756 | Just as := args readers ss
757 | | Nothing => Left (InvalidCmdArgs (cmdName x) ss $
usageHeader $
Just x)
763 | readCommand : (0 c : Type)
767 | -> Either PackErr (CommandWithArgs c)
768 | readCommand c cd [] = readCWA defaultCommand []
769 | readCommand c cd (h :: t) = case readCommand_ {c} h of
770 | Nothing => Left (UnknownCommand h $
usageDesc {c} Nothing)
771 | Just x => readCWA x t
778 | adjConfig : HasIO io
782 | => CommandWithArgs c
784 | -> EitherT PackErr io MetaConfig
785 | adjConfig (
command ** args)
= adjConfig_ command args