0 | module Pack.Runner.New
5 | import Idris.Package.Types
8 | import Core.Name.Namespace
9 | import Libraries.Text.PrettyPrint.Prettyprinter
10 | import Libraries.Text.PrettyPrint.Prettyprinter.Doc
11 | import Libraries.Text.PrettyPrint.Prettyprinter.Util
12 | import Libraries.Text.PrettyPrint.Prettyprinter.Render.String
16 | newPkgDesc : (name : Body) -> (mod : Body) -> (user: Maybe String) -> PkgDesc
17 | newPkgDesc name mod user =
18 | let modName := (nsAsModuleIdent $
mkNamespace "\{mod}", "")
19 | in { authors := user
20 | , version := Just (MkPkgVersion (0 ::: [1, 0]))
21 | , mainmod := toMaybe (mod == "Main") modName
22 | , executable := toMaybe (mod == "Main") "\{name}"
23 | , modules := guard (mod /= "Main") *> [modName]
24 | , sourcedir := Just "src"
25 | } (initPkgDesc "\{name}")
27 | newTestPkgDesc : (name : Body) -> (user: Maybe String) -> PkgDesc
28 | newTestPkgDesc name user =
30 | , version := Just (MkPkgVersion (0 ::: [1, 0]))
31 | , mainmod := Just (nsAsModuleIdent $
mkNamespace "Main", "")
32 | , executable := Just "\{name}-test"
33 | , depends := [MkDepends "\{name}" anyBounds]
34 | , sourcedir := Just "src"
35 | } (initPkgDesc "\{name}-test")
37 | toModuleName : List Char -> List Char
38 | toModuleName [] = []
39 | toModuleName (h :: t) = toUpper h :: map adjHyphen t
42 | adjHyphen : Char -> Char
48 | capitalize : Body -> Body
49 | capitalize b@(MkBody xs prf) = fromMaybe b $
fromChars (toModuleName xs)
51 | mainModFile : String
57 | main = putStrLn "Hello from Idris2!"
67 | main = putStrLn "Test successful!"
71 | libModFile : Body -> String
77 | test = "Hello from Idris2!"
81 | packTomlContent : Body -> String
82 | packTomlContent name =
84 | [custom.all.\{name}]
87 | ipkg = "\{name}.ipkg"
88 | test = "test/test.ipkg"
90 | [custom.all.\{name}-test]
97 | getModFile : PkgType -> Body -> (Body, String)
98 | getModFile PLib pkgName = let mod = capitalize pkgName in (mod, libModFile mod)
99 | getModFile PApp pkgName = ("Main", mainModFile)
101 | gitIgnoreFile : String
112 | {auto _ : HasIO io}
113 | -> (curdir : CurDir)
115 | -> (pkgName : Body)
117 | -> EitherT PackErr io ()
118 | new (CD curdir) pty pkgName e = do
119 | debug "Creating new \{pty} package named \{pkgName}..."
120 | debug "Getting author name from git config"
121 | user <- Just <$> trim <$> sysRun ["git", "config", "user.name"]
122 | `catchE` (const $
right Nothing)
123 | debug "Creating PkgDesc"
124 | let (mod, modFile) = getModFile pty pkgName
126 | let pkgRootDir := curdir /> pkgName
127 | srcDir := pkgRootDir </> "src"
128 | testDir := pkgRootDir </> "test"
129 | ipkg := newPkgDesc pkgName mod user
130 | test := newTestPkgDesc pkgName user
132 | debug "Creating parent and src directories"
136 | when (e.env.config.gitInit) $
do
137 | debug "Initializing git repo"
139 | (\err => warn "Git repo creation failed: \{printErr err}")
140 | (\_ => write (pkgRootDir </> ".gitignore") gitIgnoreFile)
141 | (sysAndLog Info ["git", "init", pkgRootDir])
143 | debug "Writing ipkg file"
145 | (pkgRootDir /> (pkgName <+> ".ipkg"))
146 | (renderString (layoutUnbounded $
pretty ipkg) ++ "\n")
148 | debug "Writing test.ipkg file"
150 | (testDir </> "test.ipkg")
151 | (renderString (layoutUnbounded $
pretty test) ++ "\n")
153 | debug "Writing test Main.idr file"
154 | write (testDir </> "src" </> "Main.idr") testFile
156 | debug "Writing pack.toml"
157 | write (MkF pkgRootDir packToml) (packTomlContent pkgName)
159 | debug "Writing module file"
160 | write (MkF srcDir $
mod <+> ".idr") modFile
161 | info "Created \{pty} package '\{pkgName}'"